- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
最近开始学习lisp。我正在查看书中的示例 Land of Lisp在我看到第 7 章附近的以下示例之前,我觉得我已经很好地理解了所有内容:
(defun quote-it (x)
(list 'quote x))
现在,我知道 list
会创建一个带有参数的列表,比如 (list 1 2 3 4)
会计算出列表 (1 2 3 4)
。
而且我还知道 quote
允许我引用一个论点,就像我可以使用 '
一样。所以 'east
与 (quote east)
现在,有趣的是,上面的函数不返回列表,而只是引用我传递给它的任何内容。所以,如果我称它为
(quote-it east)
它只会返回 'east
而不是 ('east)
如果我这样做了,我会把这个函数写成
(defun quote-it (x)
(quote x))
因此,我不知道为什么我们在书中示例中的 (list 'quote x)
中将命令写为 'quote
。
我知道我可以使用引号在代码和数据之间切换,例如 '(+ 1 2)
,但在这种情况下,我的意图似乎是在此处实际应用引号功能。那么,为什么要(list 'quote x)
?
那么,有经验的人可以澄清一下吗?
最佳答案
Lisp 源代码由一些在 Lisp 编程中使用的相同数据结构表示。这里特别重要的是列表和符号。当 Lisp 计算一个形式为
的形式时(quote something)
也就是说,当 Lisp 计算一个列表形式时,它的第一个元素是符号 quote
, 然后它返回对象 something
不对其进行评估。因此
(quote 2) ;=> 2
(quote (a b c)) ;=> (a b c)
现在,这就是求值器(或编译器等)在获取要求值的 Lisp 对象时所做的事情,而该对象恰好是一个列表,其第一个元素是符号 quote
。 .作为 Lisp 程序员,我们仍然必须编写代码供 Lisp 阅读器 阅读并传递给评估者。我们可以写长表格
(quote 2)
(quote (a b c))
在我们的源代码中,Lisp 阅读器将读取它们并将它们传递给编译器,但我们是 virtuous programmers ,所以我们很懒,想避免打字。所以,我们可以输入
'2
'(a b c)
相反。 编译器 最终得到完全相同的输入;第一个元素是符号 quote
的列表第二个值为 2
或 (a b c)
.
现在我们可以讨论您的代码了。表格
(list 'quote x)
返回一个列表,其第一个元素是符号 quote
,其第二个元素是变量的值 x
.这可以打印为
(quote <value-of-x>) ; fill in x's value for <value-of-x>, of course
现在,Lisp 打印机有点聪明,它可以选择使用我们在编写源代码时允许使用的相同速记来打印类似的东西。这样也可以打印为
'<value-of-x>
现在我们已经足以解决您关于本书代码的问题了:
Now, interestingly, the function above does not return a list, but simply quotes whatever I pass to it. And so, if I call it
(quote-it east)
it would simply return'east
and not('east)
自 'east
是 (quote east)
的缩写,我们现在看到 (quote-it east)
确实,事实上,返回一个列表。它是您期望的形式的列表:第一个元素是符号 quote
的列表其第二个元素是符号 east
.如果它返回('east)
,它仍然会返回一个列表,但它会返回一个错误形式的列表。 ('east)
是,当我们展开缩写时,列表 ((quote east))
;也就是说,它是一个包含单个元素的列表,而该元素是另一个列表,其第一个元素是符号 quote
其第二个元素是符号 east
.这当然是一个列表,但它不是您要查找的列表。
现在我们可以看一下您建议的代码。你的功能quote-it
只有在您调用 (quote-it 'x)
的情况下才会碰巧起作用.也就是说,你可以做
(quote-it 'x)
;=> x
但请注意,您得到了一个符号,并且您得到了符号x
。后退。您没有得到第一个元素是符号 quote
的列表第二个元素是<value-of-x>
.当您使用 quote-it
使用其他值,您会看到问题:
(quote-it 2)
;=> x
你仍然得到一个符号,因为
(defun quote-it (x)
(quote x)) ; or 'x
接受一个参数,将其绑定(bind)到词法变量 x
, 然后返回 (quote x)
的值. (quote x)
的值是多少? ?如前所述,当求值器(或编译器等)获得符号列表时 quote
和 something
, 值为文字 something
.由于 body quote-it
是符号列表 quote
和符号 x
,正文的值(value)quote-it
是符号 x
.
关于lisp - 在 Common Lisp 中引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20041446/
你们能帮帮我吗,这是我们的讲师给我们的教程问题,无论我们尝试了多少,我们实际上似乎都无法破解它。请帮忙 ; perform some type/error checking, ; then ca
在 Common Lisp 中编写、编译和测试一个函数,该函数接受一个列表并计算列表中正整数的总数。必须编译然后执行包含函数的 .lisp 文件。在编译该文件后开始传递它,列出要生成的结果的结果,从而
我是 Lisp 初学者,我很难理解为什么下面的代码会给我一个错误。 (dolist (elem '(mapcar mapcon)) (when (fboundp `
我听说 Lisp 可以让你重新定义语言本身,我也试图研究它,但没有任何地方明确的解释。有人有一个简单的例子吗? 最佳答案 Lisp 用户将 Lisp 称为 可编程编程语言 .用于符号计算 - 用符号计
Closed. This question is off-topic. It is not currently accepting answers. Learn more。 想改进这个问题吗Updat
这些是 cons 参数的不同组合的输出。我刚开始学习 lisp。有人可以帮我理解这些吗? Break 80 [81]> (CONS '(A) 'B) ((A) . B) Break 80 [81]>
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我想问一下为什么这个功能不起作用... (defun nenum(ls) (cond ((null ls) nil) ((listp car(ls)) (nenum (rest ls)
如果我有一个原子,例如“a4”,我需要能够将 1 添加到“4”部分以使其成为 a5,但是因为它被认为是一个字符串,所以这是不可能的,所以如果我可以拆分 (a4 ) 到 ((a)(4)) 中,然后我可以
我有一个关于动态构建函数(或类似的东西)的问题。在 Java 中,我可以通过编程将一些 Source 写入字符串,编译该字符串并像函数一样执行它多次。 假设我有一些遗传算法来创建最佳代码以获取 n 个
我是 Common Lisp 的新手,正在学习教程,但无法全神贯注 (equal '(reverse (a b)) '(b a))) 返回零。 非常感谢您的协助。 M. 最佳答案 在 lisp 中引
我有一个使用列表表示的树。例如: (1 ((2 (3)) (3 (2)))) (2 ((1 (3)) (3 (1)))) (3 ((1 (2)) (2 (1)))))` 现在我需要在维护层次结构树的同
在此站点:http://www.gigamonkeys.com/book/practical-a-simple-database.html有如下列出的用户入口函数: (defun prompt-rea
我对 lisp 比较陌生,对在以下上下文中使用嵌套列表的最佳方法很好奇: 所以,我有以下功能: (defun get-p0 (points) (loop for (label x y) in
我正在为 CLOS 类编写一个函数,该函数反转所述类对象的列表元素。 我有一个返回反向列表的方法,但如何让它将对象的列表设置为该列表?我可以在存储列表的函数中有一个实例变量,然后将元素设置为那个吗?或
我知道,严格来说,没有编译语言或解释语言这回事。 但是,一般来说,LISP 是用来编写 Python、bash 脚本、批处理脚本之类的脚本的吗? 还是像 C++、JAVA 和 C# 这样的通用编程语言
在此站点 http://jatha.sourceforge.net/快速函数的示例是通过递归。是不是递归通常比 Lisp 中的迭代更快并且性能更好? 编辑:Lisp 是否比其他语言更优化递归? 最佳答
另一个新手(常见)LISP 问题: 基本上在大多数编程语言中,函数都有一种方法接收对变量的引用而不仅仅是值,即通过引用传递而不是通过值传递。比方说,为了简单起见,我想编写一个 LISP 函数来接收一个
这个问题在这里已经有了答案: How do I find the index of an element in a list in Racket? (3 个答案) 关闭 9 年前。 如果我有这样的列
我在为这个程序生成正确的输出时遇到了一些问题。我的输出几乎是正确的,但缺少一些步骤。我的代码如下: (defun kt (x y m n) ;set the
我是一名优秀的程序员,十分优秀!