List Racket中列表内的表达式
如果我有一个这样的列表List Racket中列表内的表达式,list,racket,List,Racket,如果我有一个这样的列表(定义lst'(,(car'(1 2))(1 2))(,(car'(3 4))(3 4))),我尝试“计算”表达式(即作为结果”((1(1 2))(3(3 4)))),我得到的列表与我得到的列表相同 我知道如果我使用(qoasiquette((,(car'(1 2))(1 2))(,(car'(3 4))(3 4))我会得到我想要的,但问题是在使用迭代方法执行时,(我认为)我不能只获取值,而不作为列表(即只获取qoasiquette表达式的第二部分) 例如,如果我对/lis
(定义lst'(,(car'(1 2))(1 2))(,(car'(3 4))(3 4)))
,我尝试“计算”表达式(即作为结果”((1(1 2))(3(3 4)))
),我得到的列表与我得到的列表相同
我知道如果我使用(qoasiquette((,(car'(1 2))(1 2))(,(car'(3 4))(3 4))
我会得到我想要的,但问题是在使用迭代方法执行时,(我认为)我不能只获取值,而不作为列表(即只获取qoasiquette
表达式的第二部分)
例如,如果我对/list使用,并且我确实使用(list ref lst 0)
,当我想要(,(car'(12))(12))
在qoasiquete
函数中使用它时,我会获得(,(car'(12))(12))
如何获取列表中的表达式并对其求值
谢谢。我很有信心我们这里有一个新的解决方案,因为您所描述的是非常不寻常的。此外,我在这里设想的唯一解决方案是使用eval
,这再次表明您可能走错了方向
但这里有一个小尝试,我相信你想要的:
(定义lst'((列表(car'(12))'(12))
(名单(汽车(34))"(34))
(定义名称空间锚nsa)
(定义ns(名称空间锚->名称空间nsa))
(用于/列表((i lst))
(定义e(评估)
(printf“评估~a到~a\n”即e)
(e)
哪个会打印
评估(列表(car’(12))(12))到(1(12))
评估(列表(car’(34))至(34))
评估
((1(12))(3(34)))
因此,当您引用数据时,它就像一些流行的Algol方言(如perl)中的单引号。例如,打印“$\u”
实际上打印的是$\u1,而不是变量$\u1表示的值。如果您使用双引号,字符串中的变量将扩展为它的值
在Scheme中,我们有(quote x)
,它是'x
。由于它是用'
引用的,所以它中的任何内容都不会被评估。如果它是`x
,它与(quasikote x)
相同,那么Scheme会查找,表达式
(与(unquote expression)
(与(unquote expression)相同)和,@expression
(与(不引用拼接表达式)
)相同。这些引用形式不是过程,而是宏。它将静态代码转换为不同的静态代码
所以(开始(定义测试10)`((12)(3,(+测试4));==>((12)(3 14))
方案真正做的是把它转换成(list'(1 2)(list 3(+test 4))
,而如果它是((3,(+test 4))(1 2))
,它会变成(cons)(list 3(+test 4))”((1 2))
,因为尾部可以是常量,但头部不能,如果它需要有一个经过计算的尾部的话
我从你的问题中得到的印象是,你认为你可以存储文本并在以后像(让((x'((12)(3,(+test 4 )))`x)
那样扩展它们,但这不起作用,因为准文本是一个宏,因此它将计算为x。而(让((x'((12)(3,(+test 4ЮЮ))`),x)
将计算为((12)(3,(+测试4)))
问题不清楚。请为您打算创建的/list
循环写下,指出您期望的结果和您目前获得的结果@ÓscarLópez,我希望现在能更好地解释它!我必须说,您在这里写的所有内容都在Racket手册中,我在发布问题之前阅读了它。之后,我有了我真诚地说,你的解释真的很好。比手册要好。你是对的:)。我不能,所以我将把它改成@uselpa答案。谢谢你们两位。如果我更改,
的列表,你的答案会起作用,它是一样的。但是使用,
不起作用,所以,我将把我的代码改成这个。谢谢。