以 * 作为后缀的方案名称

Scheme names with * as suffix

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

一些例子

let* define*

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

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

* 后缀可能有以下含义:

  • 顺序作用域,如let*,而不是独立作用域,如let。示例:with-syntax* 类似于 with-syntax,但每个右侧都在前面子句的范围内。
  • 顺序效应独立效应相反。示例:parameterize* is like parameterize, but each parameter's new value is evaluated with the previous parameters updated to their new values; with-handlers* 类似于 with-handlers,但每个异常处理程序都在安装了先前异常处理程序的上下文中调用。
  • 和另一件事一样,但是多次。示例:remove* is like remove, but removes all occurrences of the given element; regexp-match* 类似于 regexp-match,但会找到所有匹配项。
  • 和其他东西一样,但是最后一个参数就像一个剩余参数。示例 append*, list*(append* vss) 等同于 (apply append vss).
  • 与其他事物类似,但接受多个参数。示例:hash-set* 类似于 hash-set,但接受多个键值对。
  • 和另一件事一样,但有点不同。示例:write-bytes-avail* is like write-bytes-avail, except it never blocks; date* is like date except it adds nanosecond and time-zone-name fields; call-with-input-file*call-with-input-file 类似,除了在转义时关闭输入端口。在此用法中,您可以将 * 理解为 Scheme/Racket 版本的素数后缀。