SRFI 符号约定
SRFI notational conventions
我正在阅读(查看)Guile 参考手册,但我不理解 SRFI 指定的一些符号约定 。
请注意,Guile 参考手册似乎遵循 SRFI 文档的结构。我浏览了 GuixSD 上的源代码,找到了一些用例,但运气不佳。
比如kons
和knil
的意思我不明白。
string-fold kons knil s [start [end]]
超链接:SRFI-13 或
Guile 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
kons
和 knil
的命名是为了表示它们与 cons
和 nil
的关系,其中 (string-fold cons nil s) <=> (string->list s)
除了它可以生成列表以外的其他结构通过提供合适的 cons
类函数和 nil
值。
阅读和理解 SRFI 不需要任何先验知识。直接取自 Procedure specification:
下的 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 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
我正在阅读(查看)Guile 参考手册,但我不理解 SRFI 指定的一些符号约定 。
请注意,Guile 参考手册似乎遵循 SRFI 文档的结构。我浏览了 GuixSD 上的源代码,找到了一些用例,但运气不佳。
比如kons
和knil
的意思我不明白。
string-fold kons knil s [start [end]]
超链接:SRFI-13 或 Guile 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
kons
和 knil
的命名是为了表示它们与 cons
和 nil
的关系,其中 (string-fold cons nil s) <=> (string->list s)
除了它可以生成列表以外的其他结构通过提供合适的 cons
类函数和 nil
值。
阅读和理解 SRFI 不需要任何先验知识。直接取自 Procedure specification:
下的 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 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