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

-のfor-each代わりに使用することは同じことですが、副作用のために関数を呼び出すだけであると想定しているため、結果のリストを返す代わりに ( withを使用すると s のリストが返されます)、単に void が返されることに注意してください。mapfor-eachmapdisplayvoid

文字列以外のものを表示し、それらの間にスペースを入れたい場合、これは面倒になる可能性があります。 string を入力し、自分でスペースを追加します。リストの要素の間にスペースを追加する方が簡単です:

(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 に答える