我正在阅读(查看)Guile 参考手册,但我不理解SRFI 指定的一些符号约定。
请注意,Guile 参考手册似乎遵循 SRFI 文档的结构。我浏览了 GuixSD 上的源代码以找到一些没有运气的用例。
例如,我不明白kons
and的含义knil
。
string-fold kons knil s [start [end]]
超链接:SRFI-13或 Guile 参考手册
问:Scheme 符号约定在哪里出现?
我正在阅读(查看)Guile 参考手册,但我不理解SRFI 指定的一些符号约定。
请注意,Guile 参考手册似乎遵循 SRFI 文档的结构。我浏览了 GuixSD 上的源代码以找到一些没有运气的用例。
例如,我不明白kons
and的含义knil
。
string-fold kons knil s [start [end]]
超链接:SRFI-13或 Guile 参考手册
问: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
kons
并被knil
命名为表示它们与 where 的关系cons
,nil
除了(string-fold cons nil s) <=> (string->list s)
它可以通过提供合适的cons
类似函数和nil
值来生成列表以外的其他结构。
阅读和理解 SRFI 不需要任何先前的知识。直接取自程序规范下的 SRFI :
s
字符串。其他参数kons
和knil
没有被提及,因此它们只是需要解释的名称。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
现在kons
和knil
在许多 SRFI 中使用,并且经常在这种组合情况下使用。它确实类似于程序cons
和名称'()
。如果你使用这些:
(string-fold cons '() "abracadabra" 8) ; ==
(cons #\a (cons #\r (cons #\b '()))) ; ==> (#\a #\r #\b)
因此,这些名称虽然不是随机的,但并不需要为了阅读和理解 SRFI 而被理解。所有其他 SRFI 都有类似的规格。您可能对具有以下示例的SRFI-9 定义记录类型感兴趣:
(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