Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lisp Case语句中的动态变量_Lisp_Common Lisp - Fatal编程技术网

Lisp Case语句中的动态变量

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包含*红色玩家*作为文本,而不是变量*红色玩家*的内容 我知道我可

我用common lisp编写了这段代码(忽略…因为在这里粘贴该部分是没有意义的)

red player和black player是使用defvar语句定义的变量,用于“模拟”C中的#define语句

(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)