Lisp:报价的评估

发布于 2024-12-07 03:31:51 字数 243 浏览 0 评论 0原文

以下哪个表达式的 Lisp 语法是正确的?

(+ 1 (quote 1))
==> 1 (???)
(+ 1 (eval (quote 1))
==> 2

我目前正在编写自己的 lisp 解释器,不太确定如何正确处理引号。我见过的大多数 Lisp 解释器都将这两个表达式计算为“2”。但是,难道不应该根本不评估引用,从而只有第二个才是合法的表达式吗?那为什么它还能起作用呢?这是某种语法糖吗?

Which of the following expressions has correct lisp syntax?

(+ 1 (quote 1))
==> 1 (???)
(+ 1 (eval (quote 1))
==> 2

I'm currently writing my own lisp interpreter and not quite sure how to handle the quotes correct. Most lisp interpreters I've had a look at evaluate both expressions to "2". But shouldn't the quote be not evaluated at all and thereby only the second one be a legal expression? Why does it work then anyway? Is this some kind of syntactical sugar?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

贩梦商人 2024-12-14 03:31:51

除非有特殊形式,大多数 Lisp 首先计算参数,然后应用函数(因此出现了 eval-and-apply 短语)。

您的第一个表单 (+ 1 '1) 将首先评估其参数 1'1。常量数字计算自身,而引用计算其引用的内容,因此您需要将 + 应用于 11,产生<代码>2。

eval: (+ 1 (quote 1))
eval 1st arg:  1 ==> 1
eval 2nd arg: '1 ==> 1
apply: (+ 1 1) ==> 2

第二种形式类似,不带引号的 1 只会执行一次 eval ,再次产生 1

eval: (+ 1 (eval '1))
eval 1st arg: 1 ==> 1
eval 2nd arg: (eval '1)
  eval arg:    '1 ==> 1
  apply: (eval 1) ==> 1
apply: (+ 1 1) ==> 2

Barring special forms, most Lisps evaluate the arguments first, then apply the function (hence the eval-and-apply phrase).

Your first form (+ 1 '1) would first evaluate its arguments 1 and '1. Constant numerics evaluate to themselves, and the quote evaluates to what it quotes, so you'd be left applying + to 1 and 1, yielding 2.

eval: (+ 1 (quote 1))
eval 1st arg:  1 ==> 1
eval 2nd arg: '1 ==> 1
apply: (+ 1 1) ==> 2

The second form is similar, the unquoted 1 will just go through eval once, yielding 1 again:

eval: (+ 1 (eval '1))
eval 1st arg: 1 ==> 1
eval 2nd arg: (eval '1)
  eval arg:    '1 ==> 1
  apply: (eval 1) ==> 1
apply: (+ 1 1) ==> 2
哎呦我呸! 2024-12-14 03:31:51

数字会自行求值,因此 (quote 1)1 相同。

Numbers evaluate to themselves so (quote 1) is the same as 1.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文