【问题标题】:defun and lambda in lisp [duplicate]lisp 中的 defun 和 lambda [重复]
【发布时间】:2013-05-28 13:41:00
【问题描述】:

我们有两种定义函数的方法:defun 和 lambda,我们可以使用 setf 来标记 lambda 函数。

(defun g (x) (* x x)) 
(setf f (lambda (x) (+ x x)))

函数可以是列表中的第一个元素。

(g 3)
9

或者它可以是其他函数的参数。

(mapcar #'g '(1 2 3))
(1 4 9)    

但是对于 lambda,用法有所不同。

(funcall f 3)
6

(mapcar f '(1 2 3))
(2 4 6)

我很好奇这些差异背后的逻辑是什么?

与方案相当一致的用例相比,它更加令人困惑。

> (define (g x) (+ x x))
> (g 3)
6
> (map g '(1 3 4))
(2 6 8)

> (define f (lambda (x) (* x x)))
> (f 2)
4
> (map f '(1 2 3))
(1 4 9)

【问题讨论】:

  • 2 个命名空间,一个用于 f 之类的 var,一个用于 g 之类的函数。一旦它被传递到地图中,你就必须funcall g
  • 是的,在这种情况下Scheme是一致的。
  • GoZoner:声称方案是一致的就是宗教,因为这意味着其他任何事情都是不一致的。 Lisp 在分离函数和值命名空间方面是一致的,它以一致的方式扩展到进一步的命名空间。例如,(defclass foo ..) 的存在并不妨碍您拥有名为 foo 的函数或名为 foo 的词法或动态变量。

标签: lambda lisp


【解决方案1】:

【讨论】:

    猜你喜欢
    • 2018-02-23
    • 2021-03-30
    • 1970-01-01
    • 2017-07-17
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    相关资源
    最近更新 更多