我需要将函数应用于所有元素,但列表中的最后一个元素。基本上我正在编写一种玩具编译器,因此给出一个像这样的算术术语:
(+ 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。
提前多多感谢。
答案 0 :(得分:2)
我会将format
用于此类案件。以下经过测试的*代码(感谢@Chris Jester-Young)可能会满足您的需求:
(format #f "~a(~{~a~^, ~})" (compile-term (car seq))
(map compile-term (cdr seq)))
当您有州时,您可能更愿意使用fold-*
。您的string-append
可以替换为在编译术语上调用string-append
的匿名函数,并在使用初始值fold
调用时跳过逗号。