Lisp 定义原子函数

Lisp 定义原子函数,lisp,common-lisp,Lisp,Common Lisp,我是一个新的通俗lisp语言的人,我的朋友被这个简单的问题困住了。 如果输入是原子,我需要定义一个返回true的函数 因此,如果在命令行的enter中,atom'a返回T,但我的代码不是 必须引用变量x,否则结果将为false (拆卸检查(x) if(原子'x) T) 已经有一个函数可以做到这一点。它被称为原子: (atom 1) => T (atom '(1)) => NIL 因此,这是一项毫无意义的工作。如果您必须这样做,您可以将其包装在另一个函数调用中: (defun po

我是一个新的通俗lisp语言的人,我的朋友被这个简单的问题困住了。 如果输入是原子,我需要定义一个返回true的函数

因此,如果在命令行的enter中,atom'a返回T,但我的代码不是

必须引用变量x,否则结果将为false

(拆卸检查(x)

if(原子'x)


T)

已经有一个函数可以做到这一点。它被称为原子:

(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
    (检查a)
    的形式返回
    t
    ,其中
    a
    以前是未知的
这两个条件是不能满足的。无法满足这些条件,因为该语言的评估规则禁止这样做。在类似
(勾选a)
的表格中,规则是:

  • 找出
    检查
    指的是什么类型的东西
    
  • 如果它引用一个函数,则在当前环境中按从左到右的顺序计算其所有参数
  • 从当前环境中检索
    check
    的函数绑定(此步骤可以在(2)之前、之后或期间执行)
  • 将其应用于(2)的结果
  • 参见Hyperspec的第1部分

    在您的情况下,此过程在(2)处失败:
    a
    没有绑定,因此对
    a
    的评估发出错误信号

    考虑到你被要求写一个函数,你一定是误解了这个问题


    此外,不太可能仅仅要求您编写一个关于
    atom
    的包装器:相反,问题可能是希望您重新实现
    atom
    (提示:它的定义是什么?),或者实现
    atom
    的一些变体,它认为一组不同于
    atom
    的对象是“原子的”。从您的问题(v1)中,我们无法判断哪一个是正确的。

    是的,我知道atom是如何工作的,但我正在编写的函数也必须回答t以检查a,但a是字符串,如果未引用,则不是atom。在控制台中,如果我键入atom 1,如果我键入(atom a),则返回true;如果我键入atom,则返回true。因此,我的函数必须为(检查a)返回T,但我不知道如何执行。如果键入
    (atom a)
    ,则
    a
    作为变量计算。如果未绑定,则会给出一个错误。如果希望
    atom
    为符号返回
    T
    ,则必须将符号传递给它,例如。g<代码>(atom'a)
    。如果在
    复选框中换行
    atom
    ,则仍需传递符号e。g<代码>(选中a)
    。因此我必须在命令行中传递a,我认为我只能传递a,然后将其转换为符号。顺便说一句,谢谢。@A字符串是Common Lisp中的一个原子。“带引号的字符串”根本不是字符串,而是两个元素的列表,如
    (引号“abc”)
    ,其第一个元素是符号
    quote
    ,第二个元素是字符串。
    atom
    函数正确地报告此类事件的
    nil
    。诀窍是我们必须引用它:
    (atom'(quote“abc”)
    ,这与
    (atom“”“abc”)
    相同。我想我可以在命令行中编写(检查a),a被传递给函数,引用并转换为字符串,这样我就可以确定它是否是atom。但是我得到的答复是我不能这样做,所以我应该在命令行中写(勾选“a”)。因此,必须引用