Recursion 我通过小lisper工作。函数lat?检查列表的所有元素是否为原子
该函数将列表作为参数。它是一个递归函数,用于检查列表中的每个元素。不管它是不是原子。如果每个元素都是一个原子,那么它将返回true或false 以下是显示的错误 在编译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”一样,本书也这么做,但是本书中的
(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。我的大脑可能在定义和定义之间斗争,而我在霍夫斯塔特关于类比的谈话中得到了一些东西。愿圣诞快乐永远属于你