我试图理解Lisp-1和Lisp-2之间的区别以及它与Clojure的关系,但我仍然不理解.任何人都可以开导我吗?
为什么我们必须使用funcallCommon Lisp中的高阶函数?例如,为什么我们必须使用:
(defun foo (test-func args)
(funcall test-func args))
Run Code Online (Sandbox Code Playgroud)
而不是更简单:
(defun bar (test-func args)
(test-func args))
Run Code Online (Sandbox Code Playgroud)
来自程序背景,我有点惊讶,因为我更习惯的语言(例如Python,C#)不需要区分.特别是,至少在源代码级别,C#编译器将其转换为类似的东西func.invoke().
我看到的唯一问题是,这意味着我们不能再调用全局函数test-func,因为它会被遮蔽,但这不是问题.
以下是您可以在Scheme中执行的操作:
> (define (sum lst acc)
(if (null? lst)
acc
(sum (cdr lst) (+ acc (car lst)))))
> (define sum-original sum)
> (define (sum-debug lst acc)
(print lst)
(print acc)
(sum-original lst acc))
> (sum '(1 2 3) 0)
6
> (set! sum sum-debug)
> (sum '(1 2 3) 0)
(1 2 3)
0
(2 3)
1
(3)
3
()
6
6
> (set! sum sum-original)
> (sum '(1 2 3) 0)
6
Run Code Online (Sandbox Code Playgroud)
如果我在Common Lisp中执行以下操作:
> (defun sum (lst acc) …Run Code Online (Sandbox Code Playgroud)