Scheme 在Racket中,如果一个无引号的对是用点符号构造的,那么第二个元素可以使用变量或表达式值吗?

Scheme 在Racket中,如果一个无引号的对是用点符号构造的,那么第二个元素可以使用变量或表达式值吗?,scheme,racket,Scheme,Racket,在球拍中,以下工作: (+[12]);=>3. {定义一个+} (a.[12]);=>3. 但是,我认为没有办法将b定义为(12)列表,以获得(++.b)和(a.b)返回3。有可能吗?当然可以,只需使用apply: (define a +) (define b '(1 2)) (apply a b) ; => 3 (apply + b) ; => 3 这个怎么样。。。不使用apply但使用eval。但是说真的,在这种情况下,使用apply是一个更好的主意,

在球拍中,以下工作:

(+[12]);=>3.
{定义一个+}
(a.[12]);=>3.

但是,我认为没有办法将
b
定义为
(12)
列表,以获得
(++.b)
(a.b)
返回
3
。有可能吗?

当然可以,只需使用
apply

(define a +)
(define b '(1 2))
(apply a b)       ; => 3
(apply + b)       ; => 3

这个怎么样。。。不使用
apply
但使用
eval
。但是说真的,在这种情况下,使用
apply
是一个更好的主意,它没有任何问题(
eval
但是,请参阅以了解名称空间的最后一部分):


您最近的编辑题为“代码使用我的样式”:请不要使用那种“样式”。在所有位置使用圆括号:。有些人喜欢使用方括号进行变量绑定,在某些圈子里这已经足够成熟了,这是可以接受的,但是制定自己的方括号方案可以确保没有其他人可以阅读您的代码。@Chris,我会考虑一下,但您错了“确保没有其他人可以阅读您的代码”如果将一个简单的圆形括号替换为代码,将代码转换为可读的代码,那么代码本身应该被认为是可读的,因为替换操作在心理上甚至视觉上都是足够简单的。除此之外,我还不确定我的风格是否在某个地方自相矛盾,但现在它看起来比标准风格更具可读性。我之所以这么说,是因为有经验的Lisp和Scheme程序员已经学会了“看不见”圆括号:也就是说,圆括号实际上是看不见的。它们是为了便于机器分析,而不是为了人类阅读。当您在混合中引入其他括号类型时,它们并不容易被忽略,因为Lisp/Scheme程序员没有接受过忽略这些类型的培训。经验丰富的Lisp/Scheme程序员使用编辑器,如paredit,为他们处理括号,因此他们从不手动计算括号。这很重要。(有一天我想为Stack Overflow编写一个用户脚本,这样我就可以在网站上获得paredit功能,这样我就不必从真正的编辑器中剪切和粘贴。)@Chris,我只是想从Racket中的不同括号可以互换使用这一事实中获益。我想知道这是否可以用来提高代码的可读性。这将是一个单独的讨论,但让我感到困扰的是,人们似乎并没有声称随着时间的推移他们会喜欢Lisp插入语语法,他们只是说它“逐渐消失”。“---我不喜欢你的丈夫。----别担心,一旦你更了解他,他就会消失,看看他拥有的漂亮公寓。”我不想使用
应用
,我想知道是否有办法让虚线对符号平等地对待这两个元素,或者如果没有,原因是什么。如果可能的话,可能永远都不需要调用
apply
标记在
b
的绑定存在之前在读卡器级别进行处理。读者无法将
(a.b)
转换为
(a.12)
,因为它不知道
b
”(12)
@asumotakikawa,但它知道
(a.[12])
a
+
。我不明白为什么在计算
(a b c)
时,所有元素都是首先计算的,但在一个不带引号的点对中,只有第一个元素被计算,第二个元素必须作为一个文字原子或一个s表达式,其中的条目将被计算(我不确定我是否正确使用了术语)@Alexey:您可以设计一个计算器,将不正确的表达式视为隐式的
apply
,但仍有一些情况需要
apply
。例如,如果您想执行
(apply+(map square nums))
,该怎么办?你不能把它写成
(+(map square nums))
,因为读者会把它写成
(+map square nums)
。@Alexey:至于你的另一个问题,
(a.(12))
被写成
(a2)
,这两种形式是无法区分的。谢谢你的例子,但是我想理解为什么像
(定义a+)(定义b(列表12))(a.b);=>编译器不允许使用3
。在@AsumuTakikawa的注释中已经解释过:
符号是在读取器级别处理的,您要做的(基于两个变量的值计算表达式)发生在不同的时间,因此,根据定义,除非在阅读阶段结束后使用
eval
apply
等过程来处理表达式,否则它无法完成。好吧,我发现如何计算
(+(列表12))
,以及
(+12)
(+列表12)
。我会想得更多。我想我已经理解了你的例子:它和
(eval(quasikote(a(unquote-b)))
,对吧?@Alexey是的,完全一样。我只是用了一个简短的语法
(define a +)
(define b '(1 2))

; executing in the evaluation window

(eval `(+ ,@b))
=> 3
(eval `(a ,@b))
=> 3

; executing from the definitions window

(define-namespace-anchor an)
(define ns (namespace-anchor->namespace an))    
(eval `(+ ,@b) ns)
=> 3
(eval `(a ,@b) ns)
=> 3