Recursion 我通过小lisper工作。函数lat?检查列表的所有元素是否为原子

Recursion 我通过小lisper工作。函数lat?检查列表的所有元素是否为原子,recursion,lisp,common-lisp,Recursion,Lisp,Common Lisp,该函数将列表作为参数。它是一个递归函数,用于检查列表中的每个元素。不管它是不是原子。如果每个元素都是一个原子,那么它将返回true或false 以下是显示的错误 在编译LAT时: (defun lat (lambda (l) (cond ((null l) t) ((atom (car l))(lat (cdr l)) (t nil)))) 就像Hal Abelson在SICP视频中称Scheme为“lisp”一样,本书也这么做,但是本书中的

该函数将列表作为参数。它是一个递归函数,用于检查列表中的每个元素。不管它是不是原子。如果每个元素都是一个原子,那么它将返回true或false

以下是显示的错误 在编译LAT时:

(defun lat
  (lambda (l)
    (cond ((null l) t)
          ((atom (car l))(lat (cdr l))
          (t nil))))

就像Hal Abelson在SICP视频中称Scheme为“lisp”一样,本书也这么做,但是本书中的语言是Scheme的前身,而不是普通的lisp。当你看到:

Bad lambda list : (LAMBDA (L)
                    (COND ((NULL L) T) ((ATOM # #)) (T NIL)))
   [Condition of type CCL::COMPILE-TIME-PROGRAM-ERROR]
这与CL中的相同:

(define name 
  (lambda (arg ...) 
    body ...)
原因是在Scheme中,运算符和操作数绑定的名称空间是相同的。类似于Common lisp的lisp-2可以像这样将其拆分:

(defun name (arg ...)
  body ...)
这可能不会发生,因为您可以始终使用
defun
,但如果您从函数返回函数,则可以执行此操作,或者必须依靠
funcall
apply
使用返回值:

(setf (fdefinition 'name)
  (lambda (arg ...)
    body ...))
使用此选项时,您可能希望全局绑定它:

;; This is a function that creates a function
(defun get-counter (from step)
  (lambda ()
    (let ((tmp from))
      (incf from step)
      tmp)))
或者在函数中,您将其绑定到普通变量,并需要
funcall
应用

(setf (fdefinition 'evens) (get-counter 0 2))
(evens) ; ==> 0
(evens) ; ==> 2
你喜欢哪一个

(defparameter *odds* (get-counter 1 2))
(funcall *odds*)
; ==> 1
那个?在
lat?
inindicated谓词中,以及在CL-a中,p最后也做了同样的事情。假设函数
latp
返回
nil
t
,因此它根本不应该返回函数。因此:

(list (funcall *odds*) (evens))
; ==> (3 4)
这当然与:

(defun latp (list)
  (cond ((null list) t)
        ((atom (car list)) (latp (cdr list)))
        (t nil)))

与使用名称
list
的Scheme不同,参数不影响对
list
的函数调用

就像Hal Abelson在SICP视频中称Scheme为“lisp”一样,本书也这么做,但是本书中的语言是Scheme的前身,而不是普通的lisp。当你看到:

Bad lambda list : (LAMBDA (L)
                    (COND ((NULL L) T) ((ATOM # #)) (T NIL)))
   [Condition of type CCL::COMPILE-TIME-PROGRAM-ERROR]
这与CL中的相同:

(define name 
  (lambda (arg ...) 
    body ...)
原因是在Scheme中,运算符和操作数绑定的名称空间是相同的。类似于Common lisp的lisp-2可以像这样将其拆分:

(defun name (arg ...)
  body ...)
这可能不会发生,因为您可以始终使用
defun
,但如果您从函数返回函数,则可以执行此操作,或者必须依靠
funcall
apply
使用返回值:

(setf (fdefinition 'name)
  (lambda (arg ...)
    body ...))
使用此选项时,您可能希望全局绑定它:

;; This is a function that creates a function
(defun get-counter (from step)
  (lambda ()
    (let ((tmp from))
      (incf from step)
      tmp)))
或者在函数中,您将其绑定到普通变量,并需要
funcall
应用

(setf (fdefinition 'evens) (get-counter 0 2))
(evens) ; ==> 0
(evens) ; ==> 2
你喜欢哪一个

(defparameter *odds* (get-counter 1 2))
(funcall *odds*)
; ==> 1
那个?在
lat?
inindicated谓词中,以及在CL-a中,p最后也做了同样的事情。假设函数
latp
返回
nil
t
,因此它根本不应该返回函数。因此:

(list (funcall *odds*) (evens))
; ==> (3 4)
这当然与:

(defun latp (list)
  (cond ((null list) t)
        ((atom (car list)) (latp (cdr list)))
        (t nil)))

与使用名称
list
的Scheme不同,参数不影响对
list
的函数调用

DEFUN首先需要函数名。这就是LAT。DEFUN中函数名后面的下一个元素应该是什么?检查DEFUN的语法,然后查看代码。有什么不同?(defun())。在我的代码片段中,我将函数命名为lat,并将lambda函数作为参数传递给lat。lambda函数有一个参数l,该参数以列表作为参数。因此它需要()而您没有提供。您提供了其他不受支持的内容。您需要更改什么?
defun
已经暗示后面有一个函数,因此
lambda
是冗余的。(defun lat(l)(cond((null l)t)((atom(car l))(lat(cdr l))(t nil))应该是代码。我不知道lambda在clisp中是多余的。谢谢你!DEFUN首先需要函数名。这就是LAT。DEFUN中函数名后面的下一个元素应该是什么?检查DEFUN的语法,然后查看代码。有什么不同?(defun())。在我的代码片段中,我将函数命名为lat,并将lambda函数作为参数传递给lat。lambda函数有一个参数l,该参数以列表作为参数。因此它需要()而您没有提供。您提供了其他不受支持的内容。您需要更改什么?
defun
已经暗示后面有一个函数,因此
lambda
是冗余的。(defun lat(l)(cond((null l)t)((atom(car l))(lat(cdr l))(t nil))应该是代码。我不知道lambda在clisp中是多余的。谢谢你!它是
defun
而不是上次函数定义中的
defin
,不是吗?谢谢@Martin。我的大脑可能在定义和定义之间斗争,而我在霍夫斯塔特关于类比的谈话中得到了一些东西。愿圣诞快乐永远如此在我们上次的函数定义中,它是
defun
而不是
defin
,不是吗?谢谢@Martin。我的大脑可能在定义和定义之间斗争,而我在霍夫斯塔特关于类比的谈话中得到了一些东西。愿圣诞快乐永远属于你