2024-04-25 07:02:25 发布
网友
在python中可以这样做
EMPTY, PAWN, KNIGHT, BISHOP, ROOK, QUEEN, KING, BPAWN = range(8)
你如何在lisp中实现等价?在
假设您已经在某处定义了方便函数range,那么您可以设置如下的一些局部值:
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))))
用法示例:
(改进这个例子可能很容易:-)-我更喜欢defparameter而不是{},所以这是您可能想要更改的地方)
defparameter
在Lisp中,只使用符号会更加习惯。通常作为自我评估关键字符号:
(defparameter *chess-pieces* '(:EMPTY :PAWN :KNIGHT :BISHOP :ROOK :QUEEN :KING :BPAWN))
有时,定义数值是有原因的。尤其是当你需要和外国官员交谈时。在Lisp中,默认情况下使用符号。在
公共Lisp没有实际的枚举类型。在动态类型语言中使用符号比使用数字变量有一些优势。例如,在调试期间,变量内容更具描述性:
比较:
对比
> (setf c4 :queen) > c4 :queen
在后一个例子中,符号值是自描述性的。在
假设您已经在某处定义了方便函数
range
,那么您可以设置如下的一些局部值:然而,像这样的枚举在Lisp代码中很少使用,因为关键字(或其他符号)提供了类似的功能。在
编写一个宏来完成这个任务呢?例如:
用法示例:
^{pr2}$(改进这个例子可能很容易:-)-我更喜欢},所以这是您可能想要更改的地方)
defparameter
而不是{在Lisp中,只使用符号会更加习惯。通常作为自我评估关键字符号:
有时,定义数值是有原因的。尤其是当你需要和外国官员交谈时。在Lisp中,默认情况下使用符号。在
公共Lisp没有实际的枚举类型。在动态类型语言中使用符号比使用数字变量有一些优势。例如,在调试期间,变量内容更具描述性:
比较:
^{pr2}$对比
在后一个例子中,符号值是自描述性的。在
相关问题 更多 >
编程相关推荐