【问题标题】:Scheme names with * as suffix以 * 为后缀的方案名称
【发布时间】:2021-04-21 08:46:24
【问题描述】:

Scheme 传统中有一些形式与 更原始的 形式命名相同,但附加了 * 作为后缀。

一些例子

let* define*

现在对于这些派生形式,解释是您可以看到以前的绑定 在后来的绑定中,是一种letrec 样式,但一次创建一个ID,而不是一次创建所有ID (?)。

现在这种模式扩展到其他形式,一些包有自定义宏,以* 符号作为后缀(define-ratbag*)。这是 Scheme 部落的一些隐含约定吗?这是否记录在某处?

【问题讨论】:

  • 我认为这一切都来自let*。这似乎起源于 Maclisp,(Lisp 1.5 甚至没有 let,我不确定 Interlisp 也没有)。我认为let* 只是一个明显的“我需要另一个像这样的名字”的东西,let* 的关键目的是真正减少缩进。然后一旦你有了它,所有语义有点像它的东西都可能以x* 名称结束。但我不认为这是一个规则:我肯定会使用 x* 来表示其他类型的变体。
  • 感谢您的历史记录!
  • @tfb 作为 Kleene 明星,__* 毕竟可以被视为“多”或“序列”。所以也许这就是灵感。
  • @WillNess:是的,我认为这是合理的。我怀疑它会及时丢失。可能还有 maclisp 人还在附近回答,但他们可能不记得了。

标签: scheme racket


【解决方案1】:

* 后缀可能意味着几件事:

  • 顺序作用域let*,而不是独立作用域let。示例:with-syntax*with-syntax 类似,但每个右侧都在前面子句的范围内。
  • 顺序效应相对于独立效应。示例:parameterize*parameterize 类似,但每个参数的新值都是使用更新为新值的先前参数进行评估的; with-handlers* 类似于 with-handlers,但每个异常处理程序都是在安装了先前异常处理程序的上下文中调用的。
  • 像其他东西一样,但多次。示例:remove* 类似于 remove,但删除了给定元素的所有次出现; regexp-match* 类似于 regexp-match,但会找到所有匹配项。
  • 和其他东西一样,但最后一个参数就像一个休息参数。示例append*list*(append* vss) 等价于(apply append vss)
  • 和其他东西一样,但接受多个参数。示例:hash-set* 类似于 hash-set,但接受多个键值对。
  • 和其他东西一样,只是有点不同。示例:write-bytes-avail* 类似于 write-bytes-avail,除了它从不阻塞; date*date 类似,只是它添加了纳秒和时区名称字段; call-with-input-file* 就像 call-with-input-file 一样,除了在转义时关闭输入端口。在这种用法中,您可以将 * 解读为 Scheme/Racket 的主要后缀版本。

【讨论】:

  • 最后一个才是真正的意思。所有其他的都是不同的方式,它与某些特定的模式不同:-)
  • 也许 Kleene 明星是最初的灵感来源。毕竟它可以被认为是“许多”或“序列”,你的所有点除了最后一个也可以。
  • 最好的考虑方法是你想要一个foo',但这是一个无效的标识符,所以foo*...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-18
  • 1970-01-01
  • 2023-01-05
  • 2011-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多