我有一个简单的 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))
这就是我解决我的问题的方法。
即使你的问题解决了,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)
归档时间: |
|
查看次数: |
278 次 |
最近记录: |