1

我需要对列表中的最后一个元素以外的所有元素应用一个函数。基本上我正在编写一种玩具编译器,所以给出这样的算术术语:

   (+ 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 的列表的最后一个元素除外?或者唯一的解决方案是使用此处所示的循环。

提前非常感谢。

4

1 回答 1

2

我会使用 format这种情况。以下经过测试的*代码(感谢@Chris Jester-Young)可能会满足您的需求:

(format #f "~a(~{~a~^, ~})" (compile-term (car seq))
                            (map compile-term (cdr seq)))

当你有一个状态时,你可能更喜欢使用fold-*. 你string-append可以被一个调用string-append编译术语的匿名函数替换,并在使用初始值调用时跳过逗号fold

于 2015-10-16T08:00:53.250 回答