【问题标题】:What is double-parentheses in Scheme/Racket?什么是 Scheme/Racket 中的双括号?
【发布时间】:2020-02-11 23:59:24
【问题描述】:

这是 Racket 中 for 循环的示例:

(define List '(1 2 3))
(for ((I List))
  (displayln I)
)

在 Scheme/Racket 中,包裹某事物的单括号对用于评估。但是上面的for 循环形式将第一个参数作为((I List)) 包裹在双括号对中。

好像是这样的:

  • 首先,评估(I List)
  • 然后,评估I List

在双括号中,这种评估的实际理论意义是什么?

【问题讨论】:

  • 了解一下,虽然您会经常看到 Scheme 中的绑定列表作为双括号,但 Racket 允许括号像括号一样,并且一些(可以说是大多数)Racket 用户更有可能使用括号编写绑定。也就是说,写(for ([x '(1 2 3)]) (displayln x)) 而不是(for ((x '(1 2 3))) (displayln x))condsyntax-case 等也一样。
  • [ ] 在一般编程中是一个列表,所以我现在更喜欢使用for [(i List)] Form 代替:)

标签: for-loop scheme lisp racket evaluation


【解决方案1】:

这是一个绑定序列,而不是函数调用。

(let* ((x 1) (y 2) (z 3))  ; <-- sequence of bindings
  (displayln (+ x y z)))

类似地:

(for ((x '(1 2 3)) (y '(3 2 1))) ; <-- like above 
  (displayln (+ x y)))

理论上,语言要么以不同方式解析它们,要么将它们扩展为其他形式(宏)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    • 2015-08-09
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多