2

在 R5RS 方案中,如何通过一次调用显示多个参数?我下面的实现有效,但添加了额外的括号和空格。

#!/usr/bin/env racket
#lang r5rs
(define (display-all . rest) (display rest))
(display-all "I " "have " "a " "lovely " "bunch " "of " "coconuts\n")

结果是

owner@K53TA:~$ ./Template.ss
(I  have  a  lovely  bunch  of  coconuts
)
4

2 回答 2

6

最简单的:

(define (display-all . vs)
  (for-each display vs))

请注意,使用 offor-each而不是map-for-each是相同的,但假设您只是为副作用调用该函数,因此它不会返回结果列表(使用mapwithdisplay将返回voids 列表)它只是返回 void。

如果你想显示非字符串的东西并在它们之间有间距,这可能会很烦人,例如,如果你想 (display-all 12 "bananas") 显示字符串 "12bananas",你必须手动将数字转换为字符串并自己添加空格。在列表的元素之间添加空格会更容易:

(define (insert-between v xs)
  (cond ((null? xs) xs)
        ((null? (cdr xs)) xs)
        (else (cons (car xs)
                    (cons v (insert-between v (cdr xs)))))))

(define (display-all . vs)
  (for-each display (insert-between " " vs)))

现在调用这个:

(display-all "blah" 4 "bloo")

做你所期望的。如果您不希望自动插入空格,您可以指定另一个参数作为分隔符对象并根据需要使用它。这是一个接受分隔符对象的版本:

(define (display-all sep . vs)
  (for-each display (insert-between sep vs)))

但是,这种方法在支持可选和关键字参数的方案版本中更有意义,因此您可以将其默认为空格或空字符串,而不会干扰其余参数。

于 2014-10-24T01:12:01.857 回答
2

如果所有参数都是字符串,只需使用applystring-append。两者都在 r5rs

#!/usr/bin/env racket
#lang r5rs
(define (display-all . rest) (display (apply string-append rest)))
(display-all "I " "have " "a " "lovely " "bunch " "of " "coconuts\n")
于 2014-10-24T01:26:28.740 回答