1

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

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

例如,我不明白konsand的含义knil

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

超链接:SRFI-13Guile 参考手册

问:Scheme 符号约定在哪里出现?

4

2 回答 2

1

可选参数的这种表示法不仅在这里使用。它也用于 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 的关系consnil除了(string-fold cons nil s) <=> (string->list s)它可以通过提供合适的cons类似函数和nil值来生成列表以外的其他结构。

于 2019-08-10T16:07:26.237 回答
0

阅读和理解 SRFI 不需要任何先前的知识。直接取自程序规范下的 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 定义记录类型感兴趣:

(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
于 2019-08-13T21:14:36.770 回答