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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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
Syntax clojure-unqoute问题_Syntax_Clojure - Fatal编程技术网

Syntax clojure-unqoute问题

Syntax clojure-unqoute问题,syntax,clojure,Syntax,Clojure,我有一个简单的clojure语法问题(因为我不熟悉这种语言)。对于这两个示例,我有一个列表lst(1 2 3 4): 我可以用Lisp编写: =>`(列表的第一个是,(第一个lst)) (列表的第一个是1) 在Clojure中,如果我写了同样的东西(语言翻译为,to~,就像我在某处读到的那样),我会得到: =>'(列表的第一个是(第一个lst)) (列表的第一个是(clojure.core/unquote(first lst))) 我希望在Clojure中也能做我想做的事情,只是语法有误。不过,

我有一个简单的clojure语法问题(因为我不熟悉这种语言)。对于这两个示例,我有一个列表lst(1 2 3 4):

我可以用Lisp编写:

=>`(列表的第一个是,(第一个lst))
(列表的第一个是1)

在Clojure中,如果我写了同样的东西(语言翻译为,to~,就像我在某处读到的那样),我会得到:

=>'(列表的第一个是(第一个lst))
(列表的第一个是(clojure.core/unquote(first lst)))

我希望在Clojure中也能做我想做的事情,只是语法有误。不过,我找到的所有示例都先有函数,然后使用`(倒勾)。我不想调用如下函数:

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

我只想返回“(其中替换了(第一个lst)的一些列表)

我能在Clojure做这样的事吗

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

=>(def颜色lst'(红-绿-蓝))

我想回报的是:

=>`(我想要的颜色是~(first color lst))

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

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


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

我不太清楚您的代码中“列表的第一个是”是什么意思:

'(first of list is ,(first lst))
但是,如果您的意思是在列表的开头添加一个占位符,那么以下内容应该可以使用(请确保使用backtick!):

或者,使用quote将导致以下情况(这似乎是您的问题):


找到了另一条路。也许我一直都没有用“Clojure”的方式做事

(格式化“列表的第一个是%d”(第一个lst))符合我的要求


我想这部分是我在问题描述上的错误,我举了一个很糟糕的例子。问题似乎是因为我在列表中使用了字符串(可能不正确?)。而且“first”也是一个可接受的函数调用。我相信所有这些都混淆了这个问题。

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

CL和Clojure关于反引号中的符号的主要区别在于,Clojure解析准连续符号;生成名称空间限定符号(查看Clojure文档的名称):

因此,在CL中:

CL-USER> (let ((list '(foo bar baz)))
            `(first is ,(first list)))
(FIRST IS FOO)
但在Clojure:

user> (let [lst '(foo bar baz)]
        `(first is ~(first lst)))
(clojure.core/first user/is foo)
为了在Clojure中获得非限定符号(在反引号中),您必须使用如下内容:

user> `~'foo
foo
因此,要获得与CL版本相同的结果(忽略可读大小写),您必须使用:

user> (let [lst '(foo bar baz)]
        `(~'first ~'is ~(first lst)))
(first is foo)

好的,现在我有进展了。那确实有效(只是试过了)。“列表的第一个是”只是我上面代码中的一句话。那么,也许我走错了方向?当倒勾列表包含数字时,它会工作,但当它包含单词时则不会工作。我认为问题可能是“(这是一个列表)和“(这是一个列表)在Lisp中的计算结果相同。。。但不是在Clojure。可能是这样吗?似乎您遇到的问题是使用引号('),而不是倒勾(`)。Backtick应该以与字符串列表相同的方式工作。正如id所期望的,评估“(这是一个列表)yeilds(这是一个列表)。评估`(这是一个列表)yeilds(user/this user/is user/a clojure.core/list),这不是我所期望的,但这是因为我没有正确使用lang:(好的,in'(这是一个列表)clojure将该列表中的元素视为变量,而不是字符串。quote和backtick之间的区别在于,backtick名称空间将所有内容都设置为当前名称空间,而quote不设置。这就是为什么您在一个名称空间中看到“clojure.core/list”,而在另一个名称空间中看到的只是“list”。请尝试更改当前名称空间(例如(ns my namespace))您将看到backtick返回的“my namespace/list”。谢谢unignorant,您最初的语句是我找到解决方案的原因。我认为困惑实际上是您在原始示例列表中没有使用字符串;-)嘿,就是这样!从那以后,我又开始讨论另一个问题,但我想我现在会回到过去,用这个来代替。这正是我要找的,我只是无法找出正确的引号/反勾号/波浪线组合。谢谢,不客气。由于符号在当今学习/使用的大多数编程语言中并不是一流的公民,因此符号是一个必须逐渐习惯的概念。虽然其他人已经帮助您解决了问题,但请注意,这不是Clojure的方法。clojure使用关键字代替引用的符号。如果需要字符串(如示例中所示),请使用它们。所有的东西都很难看。您迟早会遇到一个难以发现的bug。所有这些'`And~通常与宏一起使用。除非必要,否则尽量避免使用。
user> (let [lst '(foo bar baz)]
        `(first is ~(first lst)))
(clojure.core/first user/is foo)
user> `~'foo
foo
user> (let [lst '(foo bar baz)]
        `(~'first ~'is ~(first lst)))
(first is foo)