gpt4 book ai didi

closures - mapcan,尖锐的报价和关闭

转载 作者:行者123 更新时间:2023-12-04 22:57:04 25 4
gpt4 key购买 nike

我对 CL 有点陌生,目前正试图绕过 mapcan , #' , funcall和关闭。
这是一个闭包,它将谓词应用于数字 n,如果正确,则返回 (list n) , 否则 nil :

(defun all-those (predicate)
(lambda (n)
(if (funcall predicate n) (list n))))

我知道我需要调用 funcall把这个闭包变成一个函数。这工作正常:
>  (funcall (all-those #'evenp) 8)
(8)

现在我尝试将特此创建的函数作为参数传递给 mapcan:
>  (mapcan #'(funcall (all-those #'evenp)) '(1 2 3 4))

我收到一个编译时错误: (FUNCALL (ALL-THOSE #'EVENP)) is not a legal function name .

但是如果我省略 #' 就可以了以及 funcall:
>  (mapcan (all-those #'evenp) '(1 2 3 4))
(2 4)

现在我很困惑。我的理解是在使用 mapcan 时需要对函数进行尖锐引用。遵循符号的函数绑定(bind) (*) 并且我需要调用 funcall当“关闭关闭”时。

是因为 #'funcall正在相互抵消,或者为什么我必须在上面的示例中省略它们?提前感谢您的任何回复。

(*) 我知道在这个例子中我并没有真正可以遵循函数绑定(bind)的符号。但是如果我使用匿名函数和 mapcan我仍然需要引用它: (mapcan #'(lambda ...

最佳答案

map 车 , 电话 等,您需要传递函数对象或符号。如果你传递一个符号,那么 符号函数 符号的用作函数。如果你传递一个函数对象,那么它被用作函数。

您的 所有这些函数返回一个函数。这意味着 (mapcan(所有这些……)……)很好。

尖引号( #' )只是 的简写。功能 形式。也就是说, #'富 相同(函数 foo) :

The value of function is the functional value of name in the current lexical environment.

If name is a function name, the functional definition of that name is that established by the innermost lexically enclosing flet, labels, or macrolet form, if there is one. Otherwise the global functional definition of the function name is returned.

If name is a lambda expression, then a lexical closure is returned. In situations where a closure over the same set of bindings might be produced more than once, the various resulting closures might or might not be eq.



所以你只用 #' 功能 带有函数名。这意味着一个符号(例如 #'car )或 lambda 表达式(例如 #'(lambda (x) x) )。这意味着以下内容不起作用(或者说真的没有意义,甚至):
#'(funcall (all-those #'evenp))

Now I'm confused. It was my understanding that I need to sharp-quote a function when using mapcan to follow the symbol's function binding (*) and that I need to call funcall when "closing a closure".



mapcar, etc., 的文档说它的第一个论点是:

function---a designator for a function that must take as many arguments as there are lists.



从词汇表:

function designator n. a designator for a function; that is, an object that denotes a function and that is one of: a symbol (denoting the function named by that symbol in the global environment), or a function (denoting itself). The consequences are undefined if a symbol is used as a function designator but it does not have a global definition as a function, or it has a global definition as a macro or a special form. See also extended function designator.



因此,您可以将函数直接传递给 map 车 , 电话 等,这正是您正在做的事情:
(mapcan (all-those …) …)

你也可以这样做:
(mapcan (lambda (x) ...) ...)
(mapcan #'(lambda (x) ...) ...)
(mapcan 'car ...)
(mapcan #'car ...)
(mapcan (symbol-function 'car) ...)

关于closures - mapcan,尖锐的报价和关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40537364/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com