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进行编程,我让他们使用长形式,以便他们始终记住语言正在做什么(当他们最终开始时,他们会更加欣赏节省工作的宏使用它们).
的define或def一些随后的表现形式给予的名称.的lambda或fn内使用时,形式给出了名称一组绑定define或def表达.这就是事情开始变得更加复杂的地方,使用宏观形式可以让你保持理智并保护你免于输入无聊.
它们定义不同类型的对象(函数、特殊变量、宏、结构、类、通用函数、方法、包)。在 Common Lisp 中,它们也位于不同的命名空间中。不同的定义形式也有不同的语法(Scheme的define结合了变量和函数的定义。但是它可以定义一个类吗?)