定义原子函数(atom function)

我是新来的 common-lisp 和我坚持这个简单的问题。我需要定义一个函数,如果输入是一个原子,则返回 true

我是新来的 common-lisp 和我坚持这个简单的问题。我需要定义一个函数,如果输入是一个原子,则返回 true

所以,如果在命令行中输入原子 'a 返回 T,但我的代码不是

变量 x 必须被引用,否则结果将是假的。

(defun 检查 (x)

如果(原子 'x)

T)

1

已经有一个函数可以做到这一点。它被称为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代表其自身,不被评估为变量名,并且符号始终是原子。

1

[这是一个扩展的评论,太长了。]

根据您的评论,您可能会感到困惑,或者您的函数无法用 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

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(555)
大写连字符名称(capitalize hyphenated words)
上一篇
从Excel中的列A中删除所有重复项
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(36条)