Gla*_*ost 2 lisp scheme racket r5rs
在 R5RS Scheme 中,如何通过一次调用显示多个参数?我下面的实现有效,但添加了额外的括号和空格。
#!/usr/bin/env racket
#lang r5rs
(define (display-all . rest) (display rest))
(display-all "I " "have " "a " "lovely " "bunch " "of " "coconuts\n")
Run Code Online (Sandbox Code Playgroud)
结果是
owner@K53TA:~$ ./Template.ss
(I have a lovely bunch of coconuts
)
Run Code Online (Sandbox Code Playgroud)
最简单:
(define (display-all . vs)
(for-each display vs))
Run Code Online (Sandbox Code Playgroud)
请注意,使用for-each代替map-for-each是同一件事,但假设您只是为了副作用而调用函数,因此它不会返回结果列表(使用mapwithdisplay将返回voids列表),而是返回 void。
如果您想显示非字符串的东西并且它们之间有间距,这可能会很烦人,例如,如果您想(显示所有 12 个“香蕉”)显示字符串“12 个香蕉”,您必须手动将数字转换为字符串并自己添加空格。在列表的元素之间添加空格会更容易:
(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)))
Run Code Online (Sandbox Code Playgroud)
现在调用这个:
(display-all "blah" 4 "bloo")
Run Code Online (Sandbox Code Playgroud)
做你所期望的。如果您不想自动插入空格,您可以指定另一个参数作为分隔符对象,然后根据需要使用它。这是一个接受分隔符对象的版本:
(define (display-all sep . vs)
(for-each display (insert-between sep vs)))
Run Code Online (Sandbox Code Playgroud)
但是,这种方法在支持可选参数和关键字参数的方案版本中更有意义,因此您可以将其默认为空格或空字符串,而不会干扰其余参数。