使用def和defn而不仅仅是定义的理由是什么?

unj*_*nj2 6 lisp scheme clojure

在Scheme中,我们只定义了所有的定义,为什么Clojure和Lisp对不同的声明使用不同的关键字?

Pin*_*hle 16

defn,defmacro,defstruct和如刚刚宏用于限定它们的对应的结构,从而不必写样板代码.例如,defn可以更容易地编写函数,因为您不再需要担心放入lambda术语(您可以在Scheme中执行,只需在定义名称后立即包围参数):

方案:

(define hello
  (lambda (name)
    (display (string-append "hello, " name))))


(define (hello name)
  (display (string-append "hello, " name)))
Run Code Online (Sandbox Code Playgroud)

Clojure的:

(def hello
  (fn [name]
    (println (str "hello, " name))))

(defn hello [name]
  (println (str "hello, " name)))
Run Code Online (Sandbox Code Playgroud)

您可以defn将其视为def+ 的mnemomic设备fn.这样的快捷方式可以减少样板编码,并使代码更容易阅读.我正在教某人如何对Scheme进行编程,我让他们使用长形式,以便他们始终记住语言正在做什么(当他们最终开始时,他们会更加欣赏节省工作的宏使用它们).

definedef一些随后的表现形式给予的名称.的lambdafn内使用时,形式给出了名称一组绑定definedef表达.这就是事情开始变得更加复杂的地方,使用宏观形式可以让你保持理智并保护你免于输入无聊.

  • 咦?这与代数中使用的相同:"将f(x)定义为x + 7,现在计算f(22)" - 定义有意看起来像它的用法.*大多数*编程语言也是如此,包括Scheme.即使是错误的东西 - 那个`f`本身也有一个值,有一个代数等价:"将f(x)定义为x ^ 2,计算f的导数". (2认同)

dmi*_*_vk 2

它们定义不同类型的对象(函数、特殊变量、宏、结构、类、通用函数、方法、包)。在 Common Lisp 中,它们也位于不同的命名空间中。不同的定义形式也有不同的语法(Scheme的define结合了变量和函数的定义。但是它可以定义一个类吗?)

  • 计划没有课程。而“define”仅真正定义变量——“lambda”定义函数。(define (abc) ...) 等价于 (define a (lambda (bc) ...)) (3认同)
  • 在Scheme中,“lambda”并不定义函数,它只创建一个函数。`define` 用于*所有*定义。是的,“Scheme”没有类,但是在几乎所有的Scheme类系统中(并且几乎所有实现都有一些OO系统)`define`也用于定义类,只是碰巧在定义评估为一个类。 (2认同)