Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.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
Common lisp 公共Lisp反引号求值:分隔符和运算符_Common Lisp_Interpretation - Fatal编程技术网

Common lisp 公共Lisp反引号求值:分隔符和运算符

Common lisp 公共Lisp反引号求值:分隔符和运算符,common-lisp,interpretation,Common Lisp,Interpretation,这是怎么回事 `(1 ,(+ 1 1) (- 4 1) 4) ; '(1 2 (- 4 1) 4) 减号(“-”)不是作为运算符处理的(而是作为符号处理的;”—而不是#’—正确吗?(我想我理解这部分。) 但是,为什么第三个左括号的计算结果确实是”(->(list..(也就是说,一个列表/表达式分隔符,而不仅仅是像上面那样的文字?)解释器是“向前看”结束分隔符,还是只是说,“好的,这应该是一个列表。如果右侧没有分隔符,则表达式无效,这不是我的问题。” 对不起,有一个让人困惑的问题;简而言之,我想

这是怎么回事

`(1 ,(+ 1 1) (- 4 1) 4) ; '(1 2 (- 4 1) 4)
减号(“-”)不是作为运算符处理的(而是作为符号处理的;”—而不是#’—正确吗?(我想我理解这部分。)

但是,为什么第三个左括号的计算结果确实是
”(
->
(list
..(也就是说,一个列表/表达式分隔符,而不仅仅是像上面那样的文字?)解释器是“向前看”结束分隔符,还是只是说,“好的,这应该是一个列表。如果右侧没有分隔符,则表达式无效,这不是我的问题。”

对不起,有一个让人困惑的问题;简而言之,我想我的问题是:口译员如何一步一步地正确评估上述列表?(也可以随意更正术语。)

Backquote是一个读取宏。它在读取时转换表达式

这样做:

 (read-from-string "`(1 ,(+ 1 1) (- 4 1) 4)")
这将作为特定于实现的表单读取。类似于以下内容:

 (list* 1 (+ 1 1) '((- 4 1) 4))
CL标准没有指定反引号解析为什么

因此,上述转换是由读者完成的

然后使用通常的规则进行评估。没有什么特别的


LIST*
获取第一个参数,并在最后一个参数之前使用它们,最后一个参数是列表。

我试图想象您的想法是什么导致了混乱。我想问题是:


如果反引号引用了一些东西,为什么括号仍然表示列表,而不仅仅是一段文字

如果这就是你要问的,那么答案(大致上,像雷纳这样的人比我更了解lisp)就是引用并不像你想象的那么简单。当lisp读取代码时,它会被一个叫做“阅读器”的东西处理。这会将代码变成语法树——一组列表,形成一个包含程序的树

引用只是对读者的一种指示,它说的是:

将`(a,b)视为(列表'a,b)

逗号的作用类似于

忽略以上内容-做你通常做的事情

我不知道这是否有帮助。如果我反驳雷纳,那么他(我想这是一个男性名字?)赢了。我只是想让你的脑子里有更多的东西


哦,还有一件事。引用不会使事物成为“文本”。它会使单词成为原子(和括号列表)。所以它真的不像“生成此文本”那么简单。

“如果反引用引用事物,为什么括号仍然意味着列表,而不仅仅是一段文本?”这正是问题所在,我知道它不是文本。(我写道)至于你的答案——公平地说——首先根据列表完成树,然后执行操作,反引号是一种运算符,这就是为什么反引号中的列表仍然是一个列表(有些混乱)这是由读取器应用的。它与转换为列表同时进行。backquote不是一个与运行时发生的任何操作相同的运算符。它是对代码的特殊指令,用于解析输入。它发生在任何计算之前。读取时间何时发生?关于CL,我只听说过编译时和运行time(后者处于解释模式)-我应该说,这是在宏扩展的上下文中。@Emanual Berg:“读取时间”是读取运行的时间。当文本s表达式被读入Lisp数据时。你写一个表达式,然后按enter键,解释器读取它-那是什么时候?然后,你
加载
一个文件,然后一次一行,读取,该行被计算,读取下一行伊曼纽尔·伯格:“解释器”什么也不读。“解释器”解释。读东西。查看函数READ的文档。READ还运行READ宏。我整天都在阅读文档和教程——但我认为你可以在社交环境中学到很多东西。我这样说是因为你听起来对我的问题很生气。我事实并非如此,我错了。当然,我会查一查看。
 (list* 1 (+ 1 1) '((- 4 1) 4))