我对lisp很陌生,我有一个关于LISP语法的问题:
(defparameter *binary-operators*
'((+ 1 +) (- 1 -) (* 2 *)
(x 2 *) (/ 2 %) (^ 3 expt)))据我所知,Def参量允许重新分配二进制运算符变量,但我对(+ 1 +)、(- 1 -) .都被评估了。我在LISP中知道(+ 46)会导致(4 + 6) = 10,但是相同的逻辑会导致(1 + +),这是没有意义的。上面的语法代表什么?
发布于 2018-11-26 08:27:35
在普通的Lisp中,
(defparameter name initial-value)(请参阅手册)引入了一个新的特殊(全局)变量name,该变量具有一个新的值,这个值是通过计算initial-value给出的。
因此,在上面的示例中,特殊变量*binary-operators*被分配了一个三元组列表,每个三元组由一个符号、一个数字和另一个符号组成。换句话说,它将一些数据分配给一个变量,而不是像您想的那样重新定义语言的语法。
从列表中的值中猜测,这似乎是一个变量,它分配了一个算术运算符的列表,每个操作符都具有优先级,并且具有等效的Common运算符/函数。也许这是用lisp表达式映射算术表达式的程序的一行,或者类似的东西。
发布于 2018-11-26 21:40:30
Lisp:列表和符号用于数据和代码
这是代码是数据的应用程序之一。在Lisp中,符号和列表是数据。但是它们也被用来编写程序:然后符号被用于变量名称、函数名等等。列表用于用Lisp语言编写表达式--这些称为窗体。
在Lisp程序中
(+ 1 2)是名为+的函数调用,具有两个值。
'(+ 1 2)或
(quote (+ 1 2))然后是data ->,符号+的列表以及数字1和2。
示例:从infix到前缀转换
您使用的表单定义了从表示数学函数的符号到转换所代表的权重和实际Lisp函数的映射。
请参阅Lispology:对前缀的插入
(defparameter *binary-operators*
; operator weight Lisp function
'((+ 1 +)
(- 1 -)
(* 2 *)
(x 2 *)
(/ 2 %)
(^ 3 expt)))我们可以使用它将infix数学表达式转换为前缀Lisp表达式(有关代码,请参阅上面链接的文章):
CL-USER 52 > (infix-prefix '(2 * 3 ^ 4))
(* 2 (EXPT 3 4))当我们更改assoc列表时,转换将是不同的。让我们改变^操作符的权重:
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*是数据,它驱动从infix数学表达式到Lisp窗体的转换。这里我们使用assoc列表来保持映射,而不是将规则硬连接到代码中。因此,我们可以通过更改assoc列表来添加新的运算符,而无需更改实际代码。
https://stackoverflow.com/questions/53477007
复制相似问题