发布于 2019-08-10 16:07:26
这里不仅使用了可选参数的这个表示法。它也用于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 endkons和knil是这样命名的,以表示它们与cons和nil之间的关系,其中(string-fold cons nil s) <=> (string->list s)除了可以通过提供适当的cons类函数和nil值来生成列表以外的其他结构之外。
发布于 2019-08-13 21:14:36
没有以前的知识需要阅读和理解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? (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)) --> 3https://stackoverflow.com/questions/57443667
复制相似问题