首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Lisp语法与(运算符-整数-运算符)格式混淆

将Lisp语法与(运算符-整数-运算符)格式混淆
EN

Stack Overflow用户
提问于 2018-11-26 08:15:52
回答 2查看 156关注 0票数 1

我对lisp很陌生,我有一个关于LISP语法的问题:

代码语言:javascript
复制
(defparameter *binary-operators*
  '((+ 1 +) (- 1 -) (* 2 *)
    (x 2 *) (/ 2 %) (^ 3 expt)))

据我所知,Def参量允许重新分配二进制运算符变量,但我对(+ 1 +)、(- 1 -) .都被评估了。我在LISP中知道(+ 46)会导致(4 + 6) = 10,但是相同的逻辑会导致(1 + +),这是没有意义的。上面的语法代表什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-26 08:27:35

在普通的Lisp中,

代码语言:javascript
复制
(defparameter name initial-value)

(请参阅手册)引入了一个新的特殊(全局)变量name,该变量具有一个新的值,这个值是通过计算initial-value给出的。

因此,在上面的示例中,特殊变量*binary-operators*被分配了一个三元组列表,每个三元组由一个符号、一个数字和另一个符号组成。换句话说,它将一些数据分配给一个变量,而不是像您想的那样重新定义语言的语法。

从列表中的值中猜测,这似乎是一个变量,它分配了一个算术运算符的列表,每个操作符都具有优先级,并且具有等效的Common运算符/函数。也许这是用lisp表达式映射算术表达式的程序的一行,或者类似的东西。

票数 6
EN

Stack Overflow用户

发布于 2018-11-26 21:40:30

Lisp:列表和符号用于数据和代码

这是代码是数据的应用程序之一。在Lisp中,符号和列表是数据。但是它们也被用来编写程序:然后符号被用于变量名称、函数名等等。列表用于用Lisp语言编写表达式--这些称为窗体。

在Lisp程序中

代码语言:javascript
复制
(+ 1 2)

是名为+的函数调用,具有两个值。

代码语言:javascript
复制
'(+ 1 2)

代码语言:javascript
复制
(quote (+ 1 2))

然后是data ->,符号+的列表以及数字12

示例:从infix到前缀转换

您使用的表单定义了从表示数学函数的符号到转换所代表的权重和实际Lisp函数的映射。

请参阅Lispology:对前缀的插入

代码语言:javascript
复制
(defparameter *binary-operators*
  ;  operator  weight  Lisp function
  '((+         1       +)
    (-         1       -)
    (*         2       *)
    (x         2       *)
    (/         2       %)
    (^         3       expt)))

我们可以使用它将infix数学表达式转换为前缀Lisp表达式(有关代码,请参阅上面链接的文章):

代码语言:javascript
复制
CL-USER 52 > (infix-prefix '(2 * 3 ^ 4))
(* 2 (EXPT 3 4))

当我们更改assoc列表时,转换将是不同的。让我们改变^操作符的权重:

代码语言:javascript
复制
CL-USER 53 > (defparameter *binary-operators*
               '((+ 1 +)
                 (- 1 -)
                 (* 2 *)
                 (x 2 *)
                 (/ 2 %)
                 (^ 1 expt)))     ; weight changed to 1
*BINARY-OPERATORS*

现在我们可以从上面转换这个例子了,我们得到了一个不同的Lisp表单:

代码语言:javascript
复制
CL-USER 54 > (infix-prefix '(2 * 3 ^ 4))
(EXPT (* 2 3) 4)

因此,*binary-operators*是数据,它驱动从infix数学表达式到Lisp窗体的转换。这里我们使用assoc列表来保持映射,而不是将规则硬连接到代码中。因此,我们可以通过更改assoc列表来添加新的运算符,而无需更改实际代码。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53477007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档