scheme - R5RS方案中如何 'display'多个参数

标签 scheme lisp 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")

结果

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

最佳答案

最简单的:

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

请注意使用 for-each 而不是 map - for-each 是同一件事,但假设您只是调用副作用函数,所以不是返回结果列表(使用 mapdisplay 将返回 void 列表)它只是返回无效。

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

(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)))

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

关于scheme - R5RS方案中如何 'display'多个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26539585/

相关文章:

lisp - Common lisp 从函数推送

user-interface - 如何在 Racket 中没有框架的 [x] 按钮的情况下退出 GUI 应用程序

scheme - DrRacket : atom? 和符号? undefined - 怎么了?

clojure - Lisp-1 和 Lisp-2 有什么区别?

scheme - 在没有条件的情况下将 Scheme/Racket 中的 bool 值转换为整数?

scheme - 访问 Scheme 和 Racket 中的结构子类型字段

lisp - 如何在Scheme/Lisp 中对符号进行算术计算?

# 符号的 LISP 含义

racket - scribble/lp 文档中未解析的链接

functional-programming - Scheme:返回另一个内部过程的过程