SRFI 符号约定

SRFI notational conventions

我正在阅读(查看)Guile 参考手册,但我不理解 SRFI 指定的一些符号约定

请注意,Guile 参考手册似乎遵循 SRFI 文档的结构。我浏览了 GuixSD 上的源代码,找到了一些用例,但运气不佳。

比如konsknil的意思我不明白。

string-fold kons knil s [start [end]]

超链接:SRFI-13Guile Reference Manual

问:Scheme 符号约定在哪里介绍?

可选参数的这种表示法不仅在这里使用。它也被用于 Unix 程序使用。

string-fold kons knil s [start [end]]

每个括号的内容是可选的。

表示它可以被称为:

string-fold kons knil s 
string-fold kons knil s start
string-fold kons knil s start end

konsknil 的命名是为了表示它们与 consnil 的关系,其中 (string-fold cons nil s) <=> (string->list s) 除了它可以生成列表以外的其他结构通过提供合适的 cons 类函数和 nil 值。

阅读和理解 SRFI 不需要任何先验知识。直接取自 Procedure specification:

下的 SRFI
  • 方括号中给出的参数是可选的。
  • 一个s参数是一个字符串。

其他参数konsknil 未提及,因此它们只是需要解释的名称。 string-fold 被解释了两次:

左折叠运算符将 kons 过程从左到右映射到整个字符串

(... (kons s[2] (kons s[1] (kons s[0] knil))))

string-fold 服从(尾)递归:

(string-fold kons knil s start end) ; ==
(string-fold kons (kons s[start] knil) start+1 end)

由此可见:

(string-fold add-char 0 "abracadabra" 8)

等同于:

(string-fold add-char (add-char #\b 0) "abracadabra" 9 11)

等同于:

(add-char #\a (add-char #\r (add-char #\b 0)))

定义如下:

(define add-char 
  (let ((ma (- (char->integer #\a))))
    (lambda (char num)
      (+ (char->integer char) ma num))))

(string-fold add-char 0 "abracadabra" 8) ; ==> 18

现在konsknil被用在许多SRFI中,并且经常出现在这种组合情况下。它确实类似于过程 cons'() 的名称。如果你使用那些:

(string-fold cons '() "abracadabra" 8) ; ==
(cons #\a (cons #\r (cons #\b '())))   ; ==> (#\a #\r #\b)

因此,这些名称虽然不是随机的,但无需理解即可阅读和理解 SRFI。所有其他 SRFI 都有类似的规格。您可能对具有以下示例的 SRFI-9 Defining record types 感兴趣:

(define-record-type :pare
  (kons x y)
  pare?
  (x kar set-kar!)
  (y kdr))

定义 KONS 为构造器,KAR 和 KDR 为访问器,SET-KAR!成为修饰符,然后 PARE?成为 :PAREs.

的谓词
(pare? (kons 1 2))        --> #t
(pare? (cons 1 2))        --> #f
(kar (kons 1 2))          --> 1
(kdr (kons 1 2))          --> 2
(let ((k (kons 1 2)))
  (set-kar! k 3)
  (kar k))                --> 3