首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在R5RS方案中“显示”多个参数

如何在R5RS方案中“显示”多个参数
EN

Stack Overflow用户
提问于 2014-10-24 00:13:55
回答 2查看 3K关注 0票数 2

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

代码语言:javascript
复制
#!/usr/bin/env racket
#lang r5rs
(define (display-all . rest) (display rest))
(display-all "I " "have " "a " "lovely " "bunch " "of " "coconuts\n")

结果:

代码语言:javascript
复制
owner@K53TA:~$ ./Template.ss
(I  have  a  lovely  bunch  of  coconuts
)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-24 01:12:01

最简单的:

代码语言:javascript
复制
(define (display-all . vs)
  (for-each display vs))

注意,使用for-each而不是map - for-each是一回事,但假设您只是为了副作用调用该函数,所以它不是返回一个结果列表(使用mapdisplay一起返回void的列表),而是返回display

如果你想要显示非字符串的东西并在它们之间有间隔,这可能会很烦人,例如,如果你想(显示-所有12个香蕉)显示字符串"12香蕉“,你必须手动将数字转换成一个字符串并自己添加空格。只在列表中的元素之间添加空格会更容易:

代码语言:javascript
复制
(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)))

现在称其为:

代码语言:javascript
复制
(display-all "blah" 4 "bloo")

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

代码语言:javascript
复制
(define (display-all sep . vs)
  (for-each display (insert-between sep vs)))

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

票数 6
EN

Stack Overflow用户

发布于 2014-10-24 01:26:28

如果所有参数都是字符串,只需使用应用串-附加。两人都在r5rs

代码语言:javascript
复制
#!/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")
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26539585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档