我是lisp的新手,我对这个LISP语法有疑问:
(defparameter 二元运算符 ’((+ 1 +)( - 1 - )(* 2 *) (x 2 *)(/ 2%)(^ 3 expt)))根据我的理解,defparameter ……
的 Lisp:列表和符号用于数据和代码中 强>
这是代码是数据的应用程序之一。在Lisp中,符号和列表是数据。但它们也用于编写程序:然后使用符号 变量名 , 功能名称 以及更多。列表用于在Lisp语言中编写表达式 - 这些被称为 形式 。
在Lisp程序中
(+ 1 2)
是名为的函数的函数调用 + 有两个值。
+
'(+ 1 2)
要么
(quote (+ 1 2))
然后是数据 - >符号列表 + 和数字 1 和 2 。
1
2
的 示例:infix to prefix conversion 强>
您使用的表单定义了从表示数学函数的符号到权重的映射,以及它为转换表示的实际Lisp函数。
看到 Lispology:中缀为前缀
(defparameter *binary-operators* ; operator weight Lisp function '((+ 1 +) (- 1 -) (* 2 *) (x 2 *) (/ 2 %) (^ 3 expt)))
我们可以用它来将中缀数学表达式转换为前缀Lisp表达式(参见上面链接的文章代码):
CL-USER 52 > (infix-prefix '(2 * 3 ^ 4)) (* 2 (EXPT 3 4))
当我们更改该关联列表时,转换将会有所不同。让我们改变一下的重量 ^ 运营商:
^
CL-USER 53 > (defparameter *binary-operators* '((+ 1 +) (- 1 -) (* 2 *) (x 2 *) (/ 2 %) (^ 1 expt))) ; weight changed to 1 *BINARY-OPERATORS*
现在我们可以转换上面的示例,我们得到一个不同的Lisp形式:
CL-USER 54 > (infix-prefix '(2 * 3 ^ 4)) (EXPT (* 2 3) 4)
所以, *binary-operators* 是数据,它驱动从中缀数学表达式到Lisp表单的转换。而不是将规则硬连接到代码中,这里我们使用的是 关联列表 保持映射。因此允许我们通过改变来添加新的运算符 关联列表 ,而无需更改实际代码。
*binary-operators*
在Common Lisp中,
(defparameter name initial-value)
(见 手册 )引入了一个新的特殊(全局)变量 name 通过评估给出一个新值 initial-value 。
name
initial-value
所以,在上面的例子中,特殊变量 *binary-operators* 被分配一个三元组列表,每个三元组由符号,数字和另一个符号组成。换句话说,它会将一些数据分配给变量,而不是像您所想的那样重新定义语言的语法。
根据列表中的值进行猜测,这似乎是一个变量,它被赋予一个算术运算符列表,每个算术运算符都具有优先级,并且具有等效的Common Lisp运算符/函数。也许这是一些程序的行,它在lisp s表达式中映射算术表达式,或类似的东西。