clojure unqoute 问题

trh*_*178 4 syntax clojure

我有一个简单的 clojure 语法问题(bc 我是该语言的新手)。对于这两个示例,我都有一个 (1 2 3 4) 的列表 lst:

在 Lisp 我可以写:

=>`(list of first is ,(first lst))
(list of first is 1)

在 Clojure 中,如果我写同样的东西(语言翻译为 , 到 ~ 因为我认为我在某处阅读)我得到:

=>'(list of first is ~(first lst))
(list of first is (clojure.core/unquote (first lst)))

我希望我也可以在 Clojure 中做我想做的事,而且我只是语法错误。我发现的所有示例都首先具有函数并使用`(反引号)。我不想调用这样的函数:

`(我的功能〜(第一个lst))

我只想返回 '(一些列表,其中替换了 ,(first lst))

我可以在 Clojure 中做这样的事情吗?

编辑:我举了一个糟糕的例子,因为我的实际问题是处理字符串。让我再试试另一个例子...

=>(def color-lst '(红绿蓝))

我想返回的是:

=>`(我想要的颜色是~(第一种颜色-lst))

这产生了我看到的所有奇怪的回报。另一种方法是

=>(格式“我想要的颜色是 %s”(第一种颜色-lst))

这就是我解决我的问题的方法。

dan*_*lei 5

即使你的问题解决了,CL 和 Clojure 之间也有一些根本区别值得一提:

CL 和 Clojure 之间关于反引号中符号的主要区别在于,Clojure 解析准引用符号;生成命名空间限定符号(查看Clojure 文档的reader 部分):

user> `foo
user/foo
Run Code Online (Sandbox Code Playgroud)

所以,在 CL 中:

CL-USER> (let ((list '(foo bar baz)))
            `(first is ,(first list)))
(FIRST IS FOO)
Run Code Online (Sandbox Code Playgroud)

但是在 Clojure 中:

user> (let [lst '(foo bar baz)]
        `(first is ~(first lst)))
(clojure.core/first user/is foo)
Run Code Online (Sandbox Code Playgroud)

为了在 Clojure 中获得一个非限定符号(在反引号内),你必须使用这样的东西:

user> `~'foo
foo
Run Code Online (Sandbox Code Playgroud)

因此,要获得与 CL 版本相同的结果(忽略 readtable-case),您必须使用:

user> (let [lst '(foo bar baz)]
        `(~'first ~'is ~(first lst)))
(first is foo)
Run Code Online (Sandbox Code Playgroud)