Lisp Case语句中的动态变量
我用common lisp编写了这段代码(忽略…因为在这里粘贴该部分是没有意义的) red player和black player是使用defvar语句定义的变量,用于“模拟”C中的#define语句Lisp Case语句中的动态变量,lisp,common-lisp,Lisp,Common Lisp,我用common lisp编写了这段代码(忽略…因为在这里粘贴该部分是没有意义的) red player和black player是使用defvar语句定义的变量,用于“模拟”C中的#define语句 (defvar *red-player* 'r) (defvar *black-player* 'b) 可以想象,当变量turn接收*红色玩家*的值('r)或*黑色玩家*的值('b)时,case语句不能正常工作,因为它期望turn包含*红色玩家*作为文本,而不是变量*红色玩家*的内容 我知道我可
(defvar *red-player* 'r)
(defvar *black-player* 'b)
可以想象,当变量turn
接收*红色玩家*
的值('r)或*黑色玩家*
的值('b)时,case语句不能正常工作,因为它期望turn包含*红色玩家*
作为文本,而不是变量*红色玩家*
的内容
我知道我可以使用cond或if+equal语句很容易地解决这个问题,因为变量的内容是在那里计算的,但我很好奇。也许有一种方法可以在Lisp中创建类似C的宏,或者有一种特殊的case语句,允许使用变量而不仅仅是文本
提前谢谢你 简短的回答是“是的,你能做到,算是吧”
较长答案的种子包括使用defmacro
创建自己版本的case
,比如mycase
,它将返回一个常规的case
表单。您定义的宏将计算案例正文中每个列表的标题
你可以打电话:
(mycase turn
(*red* ...)
(*black* ...)
(otherwise ...))
哪个会回来
(case turn
((r) ...)
((b) ...)
(otherwise ...))
给评估员。返回的案例
表单将按照您想要的方式进行评估
然后,您就可以自由地继续以c风格的方式编程,让各地的lispers感到沮丧!双赢 您可以用任何方式滥用Lisp。它像那样灵活,不像C 它并不总是喜欢你使用它。为什么要推Lisp 尝试以下方法:
(defvar *turn* nil)
(cond
((eq *turn* 'red)
...
(setq *turn* 'black)))
((eq *turn* 'black)
...
(setq *turn* 'red)))
(t
.......))
您可以使用读取时间计算将表达式的值输入到表单中
CL-USER 18 > (defvar *foo* 'a)
*FOO*
CL-USER 19 > (defvar *bar* 'b)
*BAR*
CL-USER 20 > '(case some-var (#.*foo* 1) (#.*bar* 2))
(CASE SOME-VAR (A 1) (B 2))
注意,读取时间评估不一定是改进代码维护和安全性的最佳方法
还要注意的是,在Lisp中不需要使用一个变量来描述某些内部值,如:
dashedline = 4
drawLine(4,4,100,100,dashedline)
他会口齿不清
(draw-line 4 4 100 100 :dashed-line)
在Lisp中,可以传递描述命名的符号。使用整数值或类似值的API仅在API中需要,外部软件通常使用C编写。尝试在lisp中模拟C预处理器宏。。。多么令人愉快的讽刺。它是什么类型的变量没有区别…非常感谢你的回答!我以前从未想过使用defmacro进行此操作,这是一个好主意。感谢您的想法和知识!我会仔细考虑遵循哪种方法,最终开发案例陈述。这是我的第一个解决方案,在注意到我的第一个方法没有正常工作之后。
(draw-line 4 4 100 100 :dashed-line)