Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
定义Clojure宏的同义词_Clojure_Macros - Fatal编程技术网

定义Clojure宏的同义词

定义Clojure宏的同义词,clojure,macros,Clojure,Macros,所以从开始,我发现def不能用来定义宏的同义词。下面是我尝试过的Clojure不允许的例子 ;(def def-function defn) ;(def case cond) ;(def function fn) 是否可以在Clojure中定义宏的同义词/别名?是否需要使用defmacro?要做到这一点,本质上,您必须完全按照原始宏重写宏,只需替换一个不同的名称(当然,您可以使用defmacro来执行此操作)。这是唯一可行的方法,因为宏不返回值,只需写出代码,然后进行计算 Def需要将名称绑定

所以从开始,我发现def不能用来定义宏的同义词。下面是我尝试过的Clojure不允许的例子

;(def def-function defn)
;(def case cond)
;(def function fn)

是否可以在Clojure中定义宏的同义词/别名?是否需要使用defmacro?

要做到这一点,本质上,您必须完全按照原始宏重写宏,只需替换一个不同的名称(当然,您可以使用
defmacro
来执行此操作)。这是唯一可行的方法,因为宏不返回值,只需写出代码,然后进行计算

Def需要将名称绑定到值,而不是代码块

(定义符号初始化?

创建并插入或定位一个全局变量,其名称为symbol,命名空间为当前命名空间(ns)的值。如果提供了init,则对其进行求值,并将var的根绑定设置为结果值。如果未提供init,则var的根绑定不受影响def始终应用于根绑定,即使变量在调用def的点上是线程绑定的def生成var本身(而不是其值)。如果符号已在命名空间中且未映射到内部变量,则引发异常

宏不计算其窗体:

宏是操纵形式的函数,允许语法抽象。如果调用的运算符是一个符号,用于命名作为宏函数的全局变量,则调用该宏函数并将未赋值的操作数形式传递给[斜体]。然后在宏的位置计算宏的返回值

总之,宏的作用是延迟求值,因此它不能为绑定到符号的def提供值。

可以使用宏:

user=> (defmacro def-function [& args] `(defn ~@args))
#'user/def-function
user=> (def-function g [] 2)
#'user/g
user=> (g)
2
或者您可以使用
clojure.contrib.def/defalias

user=> (use 'clojure.contrib.def)
nil
user=> (defalias def-function defn)
#'user/def-function
user=> (def-function g [] 2)
#'user/g
user=> (g)
2
可能听起来(线路)嘈杂,但


工作

再也没有像
clojure.contrib.def
这样的东西了。这是否也适用于
cljs
?我在尝试时遇到了一些错误,但我可能做了其他错误的事情。
(def ^:macro case #'cond)