![]() |
1
160
简短回答 绕过默认评估规则并执行 不 计算表达式(symbol或s-exp),并将其与类型完全相同地传递给函数。 长答案:默认评估规则 当调用一个常规函数(稍后我将讨论)时,将计算传递给它的所有参数。这意味着你可以写下:
然后评估
我们会得到
解释
好吧。如上所示,对一个函数的所有参数都进行了计算,因此如果要传递
符号
这里就是
让您的输出看起来像这样(稍微预处理一下):
记住我说过的话
对于上面给出的数据,将执行以下函数调用序列:
但是呢?
嗯,有时候你 做 想要评估参数。假设您有一个漂亮的函数处理一个数字和一个字符串,并返回一个结果列表…东西。让我们做一个错误的开始:
嘿!这不是我们想要的。我们想要 选择性地 评估一些参数,将其他参数保留为符号。试试~ 2!
不只是
好多了!顺便说一句,这种模式在宏(大部分)中很常见,因此有专门的语法来实现这一点。背引号:
就像使用
嘿,你忘了
那么,这会把我们留在哪里?哦,对了,什么事
回到
比较(在钢铁银行通用LISP上):
因为没有
总结
如果你想了解更多,我推荐彼得·塞贝尔的书 Practical Common Lisp 对于学习Lisp的实用方法,如果您已经开始学习编程了。最终,在您的Lisp旅程中,您也将开始使用软件包。Ron Garret The Idiot's Guide to Common Lisp Packages 会给你很好的解释。 快乐黑客! |
![]() |
2
48
上面写着“不要评价我”。例如,如果您想使用一个列表作为数据,而不是作为代码,那么您应该在它前面放一个引号。例如,
|
![]() |
3
17
其他人对此问题的回答令人钦佩,马蒂亚斯·本卡德提出了一个极好的警告。 不要使用引号来创建以后要修改的列表。规范允许编译器将引用的列表视为常量。通常,编译器会通过在内存中为常量创建一个值,然后从常量出现的所有位置引用该值来优化常量。换句话说,它可以将常量视为匿名全局变量。 这会导致明显的问题。如果修改一个常量,它很可能会在完全不相关的代码中修改相同常量的其他用途。例如,您可以在某些函数中将某个变量与“(1 1)”进行比较,在完全不同的函数中,用“(1 1)”开始一个列表,然后向其中添加更多内容。在运行这些函数时,您可能会发现第一个函数不再正确匹配事物,因为它现在正试图将变量与(1 1 2 3 5 8 13)进行比较,这就是第二个函数返回的结果。这两个函数是完全不相关的,但由于使用常量,它们对彼此都有影响。甚至可能发生更疯狂的不良影响,就像一个完全正常的列表迭代突然无限循环。 当需要常量列表时使用引号,例如用于比较。修改结果时使用列表。 |
![]() |
4
14
这个问题的一个答案是,引号__创建了列表数据结构__。这不太对。引用比这更重要。事实上,引号是一个微不足道的运算符:其目的是 防止 任何事情都不会发生。尤其是,它不会创造任何东西。 (引语x)说的基本上是什么都不做,只要给我x。x不必是(引语(a b c))中的列表或(引语foo)中的符号。它可以是任何物体。实际上,对(list'quote some-object)生成的列表进行评估的结果总是返回some-object,不管它是什么。 现在,(引号(a b c))似乎创建了一个元素为a、b和c的列表,原因是这样的列表实际上是它返回的;但是在计算引号表单时,该列表通常已经存在一段时间了(作为引号表单的一个组件!)在代码执行之前由加载程序或读卡器创建。 这一点的一个暗示是,修改报价表返回的列表是非常不明智的。报价返回的数据,无论出于何种目的,都应被视为 代码 正在执行,因此应视为只读! |
![]() |
5
10
引号阻止窗体的执行或计算,将其转换为数据。一般来说,您可以执行数据,然后对其进行评估。 Quote创建列表数据结构,例如,以下是等效的:
它还可以用于创建列表(或树):
你最好是拿一本关于口齿不清的入门书,比如 Practical Common Lisp (可在线阅读)。 |
![]() |
6
2
当我们想要传递参数本身而不是传递参数的值时,我们使用引号。它主要与使用列表、对和原子时传递的过程有关。 这在C编程语言中是不可用的(大多数人开始使用C编程,因此我们会感到困惑) 这是Scheme编程语言中的代码,它是Lisp的一种方言,我想您可以理解这段代码。
最后一行(原子??abc)正在按程序传递abc,以检查abc是否为原子,但当您传递(atom?abc)然后检查abc的值,并将值传递给它。从那以后,我们没有给它提供任何价值 |
![]() |
7
2
在Emacs Lisp中: 可以引用什么? 列表和符号。
引用一个数字等于该数字本身:
当你引用列表时会发生什么? 例如:
但什么是象征?
例如,在OO语言(Java/JavaScript / Python)中,符号可以表示为具有
因此,python中的符号可以实现为:
例如,在EmacsLisp中,符号可以有1)与之关联的数据和(同时-对于同一符号)2)与之关联的代码-根据上下文,可以调用数据或代码。 例如,在elisp中:
评估为
因为
例如,使用
非常感谢IRC Emacs上的人向我解释符号和引用。 |
![]() |
8
0
QUOTE返回其参数的内部表示形式。在翻阅了太多关于引用什么的解释之后 不 是的,这时灯泡亮了。如果在引用函数名时repl没有将其转换为大写,我可能就不会明白。 所以。普通的lisp函数将其参数转换为内部表示,计算参数并应用函数。Quote将其参数转换为内部表示,并只返回它。从技术上讲,这句话是正确的,说“不要评估”,但当我试图理解它做了什么,告诉我它没有做什么是令人沮丧的。我的烤面包机也不评估lisp函数;但这不是你解释烤面包机做什么的方式。 |
![]() |
9
0
另一个简短的回答:
一个很好的参考: Emacs Lisp参考手册非常清楚 9.3引用 特殊形式的引号返回其所写的单个参数,而不进行计算。这提供了一种在程序中包含常量符号和列表的方法,这些常量符号和列表不是自评估对象。(无需引用自评估对象,如数字、字符串和向量。) 特殊形式:引用对象
因为在程序中经常使用引号,所以lisp为它提供了一种方便的读取语法。一个撇号字符(___)后跟一个lisp对象(在读语法中),它扩展到一个列表,该列表的第一个元素是引号,第二个元素是对象。因此,读取语法'x是(引号x)的缩写。 下面是一些使用引号的表达式示例:
9.4背引号 后引号结构允许引用列表,但有选择地评估该列表的元素。在最简单的情况下,它与特殊形式的引号相同(在前一节中描述;请参见引号)。例如,这两种形式产生相同的结果:
后引号的参数内部的特殊标记__、_稹表示一个非_稹t常量的值。Emacs Lisp Evaluator评估_、_的参数,并将该值放入列表结构中:
用__替换__,也允许在列表结构的更深层进行替换。例如:
您还可以使用特殊标记_,@226;_将评估值拼接到结果列表中。拼接列表的元素将成为与结果列表的其他元素处于同一级别的元素。不使用__` _秷的等效代码通常不可读。以下是一些例子:
|
![]() |
armnotstrong · bash make quote未解释转义 7 年前 |
![]() |
CPak · 以编程方式选择包含字符串的列名 7 年前 |
![]() |
heron · 在html中回显引用文本的正确方法 10 年前 |
![]() |
Andy · postgresql:在页眉上强制引号 11 年前 |