我正在尝试编写一个函数来检查列表x中的每个元素是否都有属性a,所以我写道:
(defun check (a x)
(if (listp x)
(eval (cons 'and (mapcar #'a x)))))但它不起作用。(基本上,我希望a是一个函数的名称,比如blablabla,在检查函数的主体中,我希望#'a指的是函数blablabla,而不是一个名为a的函数。)现在上面的代码不起作用了。我认为在Lisp中应该能够插入函数。我怎么才能修复它?
(从字面上讲,这是我使用lisp的第一天,所以这可能是一个愚蠢的问题;)顺便说一句,我正在使用Lispworks6.0个人版。)
发布于 2011-07-30 18:30:52
这里不需要使用尖引号语法。它的目的是在变量位置使用函数名,但是a已经是一个变量了。只需编写a而不是#'a。
发布于 2011-07-30 18:28:32
你不需要eval,你可以使用apply。解决问题的方法:您需要funcall,因为您提供了a作为参数。(编辑:在这种情况下不是。)通过引用,您只引用了函数a,而不是此函数中的a。
(defun check (a xs)
(if (listp xs)
(every #'identity (mapcar a
xs))))更好的做法是使用loop
(defun check (a xs)
(if (listp xs)
(loop for x in xs
always (funcall a x))))最好,使用every
(defun check (a xs)
(if (listp xs)
(every a xs)))发布于 2011-07-30 18:42:54
下面是我如何编写类似于您的check函数的代码。我试着给它起一个更具描述性的名字。
(defun are-all-elements-fullfilling-fun-p (fun ls)
(every #'identity (mapcar fun ls)))编辑:请注意,更短更好的定义是
(defun are-all-elements-fullfilling-fun-p (fun ls)
(every fun ls)))现在假设我们想用这个函数来调用它。请注意,我倾向于在可能的情况下使用声明。我经常搞砸一些事情,如果编译器能找出错误,调试就会很容易。同时,代码也会运行得更快。
(defun is-even-p (n)
(declare (type number n))
(the boolean (= 0 (mod n 2))))你必须把#‘放在这里:
(are-all-elements-fullfilling-fun-p #'is-even-p '(1 2 3 4))
(are-all-elements-fullfilling-fun-p #'is-even-p '(38 2 4))https://stackoverflow.com/questions/6882502
复制相似问题