首页
学习
活动
专区
圈层
工具
发布

SRFI公约
EN

Stack Overflow用户
提问于 2019-08-10 16:02:46
回答 2查看 113关注 0票数 1

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

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

例如,我不理解konsknil的含义。

代码语言:javascript
复制
string-fold kons knil s [start [end]]

超链接:SRFI-13欺诈参考手册

问:在哪里提出了计划的符号约定?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-10 16:07:26

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

代码语言:javascript
复制
string-fold kons knil s [start [end]]

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

意味着它可以被称为:

代码语言:javascript
复制
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值来生成列表以外的其他结构之外。

票数 1
EN

Stack Overflow用户

发布于 2019-08-13 21:14:36

没有以前的知识需要阅读和理解SRFI。直接取自程序规范下的SRFI

  • 方括号中的参数是可选的。
  • s参数是字符串。

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

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

代码语言:javascript
复制
(... (kons s[2] (kons s[1] (kons s[0] knil))))

string-fold遵循(尾)递归:

代码语言:javascript
复制
(string-fold kons knil s start end) ; ==
(string-fold kons (kons s[start] knil) start+1 end)

因此,它表明:

代码语言:javascript
复制
(string-fold add-char 0 "abracadabra" 8)

与以下相同:

代码语言:javascript
复制
(string-fold add-char (add-char #\b 0) "abracadabra" 9 11)

与以下相同:

代码语言:javascript
复制
(add-char #\a (add-char #\r (add-char #\b 0)))

根据定义:

代码语言:javascript
复制
(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'()的名称。如果你使用这些:

代码语言:javascript
复制
(string-fold cons '() "abracadabra" 8) ; ==
(cons #\a (cons #\r (cons #\b '())))   ; ==> (#\a #\r #\b)

因此,名称虽然不是随机的,但不需要为了阅读和理解SRFI而被理解。所有其他的SRFI都有类似的规格。您可能对定义记录类型的SRFI-9感兴趣,它有以下示例:

代码语言:javascript
复制
(define-record-type :pare
  (kons x y)
  pare?
  (x kar set-kar!)
  (y kdr))

定义KONS为构造函数,KAR和KDR为访问器,SET-KAR!做个修饰语,还有帕雷?作谓语用于:

代码语言:javascript
复制
(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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57443667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档