Scheme Guile:应用函数除最后一个元素之外的所有元素
Scheme Guile: apply function all ellements but last one
我需要对除列表中最后一个元素之外的所有元素应用一个函数。基本上我在写一种玩具编译器,所以给出这样的算术项:
(+ 1 10)
我想要
Plus(1, 10)
我得到了以下信息:
Plus(1, 10 ,)
使用地图功能:
(string-append "Plus ("
(fold-right string-append ""
(map (lambda (x) (string-append x ",")) (map compile-term (cdr t)))))
其中 compile-term 是我正在编写的函数,t 是我编译的术语。
所以我的问题如下,是否有一种干净的方法可以使用 Guile Scheme 将函数应用于列表中除最后一个元素之外的所有元素?或者唯一的解决方案是使用循环 here.
非常感谢。
对于这种情况,我会使用 format
。以下经过测试*的代码(感谢@Chris Jester-Young)可能会满足您的需要:
(format #f "~a(~{~a~^, ~})" (compile-term (car seq))
(map compile-term (cdr seq)))
当你有状态时,你可能更喜欢使用 fold-*
。您的 string-append
可以替换为在编译条件下调用 string-append
的匿名函数,并在使用 fold
.
的初始值调用时跳过逗号
我需要对除列表中最后一个元素之外的所有元素应用一个函数。基本上我在写一种玩具编译器,所以给出这样的算术项:
(+ 1 10)
我想要
Plus(1, 10)
我得到了以下信息:
Plus(1, 10 ,)
使用地图功能:
(string-append "Plus ("
(fold-right string-append ""
(map (lambda (x) (string-append x ",")) (map compile-term (cdr t)))))
其中 compile-term 是我正在编写的函数,t 是我编译的术语。
所以我的问题如下,是否有一种干净的方法可以使用 Guile Scheme 将函数应用于列表中除最后一个元素之外的所有元素?或者唯一的解决方案是使用循环 here.
非常感谢。
对于这种情况,我会使用 format
。以下经过测试*的代码(感谢@Chris Jester-Young)可能会满足您的需要:
(format #f "~a(~{~a~^, ~})" (compile-term (car seq))
(map compile-term (cdr seq)))
当你有状态时,你可能更喜欢使用 fold-*
。您的 string-append
可以替换为在编译条件下调用 string-append
的匿名函数,并在使用 fold
.