我是新来的 common-lisp 和我坚持这个简单的问题。我需要定义一个函数,如果输入是一个原子,则返回 true
所以,如果在命令行中输入原子 'a 返回 T,但我的代码不是
变量 x 必须被引用,否则结果将是假的。
(defun 检查 (x)
如果(原子 'x)
T)
已经有一个函数可以做到这一点。它被称为atom
:
(atom 1)
=> T
(atom '(1))
=> NIL
因此,这是一个相当毫无意义的练习。如果你绝对必须,你可以把它包装在另一个函数调用中:
(defun pointless-exercise (x)
(atom x))
(pointless-exercise 1)
=> T
(pointless-exercise '(1))
=> NIL
请注意,您绝对不能在函数中引用x
:
(defun failed-exercise (x)
(atom 'x))
-> WARNING: parameter x is unused
(failed-exercise 1)
=> T
(failed-exercise '(1))
=> T ; oops
这是因为'x
意味着符号x
代表其自身,不被评估为变量名,并且符号始终是原子。
[这是一个扩展的评论,太长了。]
根据您的评论,您可能会感到困惑,或者您的函数无法用 Common Lisp 编写。
原因如下:
您正在编写一个函数,因此您的函数将遵守函数应用程序的语言的标准评估规则;
您需要函数check
以(check a)
的形式返回t
,其中a
以前未知。
这两个条件不能满足。它们不能满足,因为语言的评估规则禁止它。在像(check a)
这样的形式中,规则是:
找出check
指的是什么样的东西;
如果它引用一个函数,则在当前环境中以从左到右的顺序评估其所有参数;
从当前环境中检索check
的函数绑定(此步骤可以在(2)之前,之后或期间发生);
将其应用于 (2) 的结果。
请参见 Hyperspec 的3.1.2.1.2.3。
在你的情况下,这个过程失败在(2):a
没有绑定,所以评估a
信号错误。
鉴于你被要求编写一个函数,你一定误解了这个问题。
此外,不太可能要求您仅围绕atom
编写包装器:而是希望您重新实现atom
的问题(提示:它的定义是什么?),或实现atom
的某些变体,该变体将一组不同的对象视为“原子”而不是atom
。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(36条)