如何在Clojure中引用参数

oma*_*mar 1 arguments clojure quote

我是clojure的新手。我想通过以下方式在clojure中使用quote:

首先,我定义一个变量:

(def狗“动物”)

然后是一个函数:

(defn what-is [名称]

('name(str“是” name)))

如果我使用变量dog作为参数调用函数what-is:(what-is dog)

结果应为:

USER >>狗是动物

在这里,我返回了传递给函数what-is的参数的名称,而不是其值:

我得到的是:

是动物

这里没有提到参数

同样,我要寻找的是“字面意义上的”重复传递给函数的参数的名称,如以下模板所示:

(what-is x)=> x是一个...

谢谢。

Sam*_*tep 5

这不是您可以使用函数执行的操作。函数仅接收运行时值,而不接收经过评估产生这些值的代码。如果要定义一段使用实际源代码而不是运行时值的代码,则可以使用

(defmacro what-is [x]
  `(str '~x " is an " ~x))

(what-is dog)
;;=> "dog is an animal"
Run Code Online (Sandbox Code Playgroud)

如您所见,此what-is宏看起来与您的what-is功能不同;它利用Clojure的语法引用阅读器宏。而不是在运行时使用字符串作为输入调用并返回字符串作为输出的情况,而是在编译时使用一段代码(x)在编译时调用此宏,然后返回另一段代码,然后对该代码进行评估。您可以使用该macroexpand-1函数查看what-is宏返回的确切代码:

(macroexpand-1 '(what-is dog))
;;=> (clojure.core/str (quote dog) " is an " dog)
Run Code Online (Sandbox Code Playgroud)

如果需要,可以评估这段扩展的代码,看得出相同的结果:

(clojure.core/str (quote dog) " is an " dog)
;;=> "dog is an animal"
Run Code Online (Sandbox Code Playgroud)