如何在lisp中定义这样的常量?

2024-04-25 07:02:25 发布

您现在位置:Python中文网/ 问答频道 /正文

在python中可以这样做

EMPTY, PAWN, KNIGHT, BISHOP, ROOK, QUEEN, KING, BPAWN = range(8)

你如何在lisp中实现等价?在


Tags: rangebishopempty等价lispqueenrookknight
3条回答

假设您已经在某处定义了方便函数range,那么您可以设置如下的一些局部值:

(destructuring-bind (EMPTY PAWN KNIGHT BISHOP ROOK QUEEN KING BPAWN)
    (range 8)
  #| do stuff |#)

然而,像这样的枚举在Lisp代码中很少使用,因为关键字(或其他符号)提供了类似的功能。在

编写一个宏来完成这个任务呢?例如:

(defmacro defenum (&rest args)
  (let ((counter 0))
    `(progn
       ,@(mapcar (lambda (arg)
                   (cond ((symbolp arg)
                          (prog1
                              `(defparameter ,arg ,counter)
                            (incf counter)))
                         ((listp arg)
                          (prog1
                              `(defparameter ,(first arg) ,(second arg))
                            (setf counter (1+ (second arg)))))
                         (t (error "broken defenum"))))
                 args))))

用法示例:

^{pr2}$

(改进这个例子可能很容易:-)-我更喜欢defparameter而不是{},所以这是您可能想要更改的地方)

在Lisp中,只使用符号会更加习惯。通常作为自我评估关键字符号:

(defparameter *chess-pieces*
  '(:EMPTY :PAWN :KNIGHT :BISHOP :ROOK :QUEEN :KING :BPAWN))

有时,定义数值是有原因的。尤其是当你需要和外国官员交谈时。在Lisp中,默认情况下使用符号。在

公共Lisp没有实际的枚举类型。在动态类型语言中使用符号比使用数字变量有一些优势。例如,在调试期间,变量内容更具描述性:

比较:

^{pr2}$

对比

> (setf c4 :queen)

> c4
:queen

在后一个例子中,符号值是自描述性的。在

相关问题 更多 >