2016-04-28 21 views
2

私は現在Schemeを調べていますが、私が理解している方法では、任意の数の引数を取ることができます。Scheme - オプションの引数とデフォルト値

私はこれを使って遊んでいますが、私はそのコンセプトを理解するのに苦労しています。

たとえば、ユーザーから提供された情報に基づいてウェルカムメッセージを書きたいとします。

ユーザーは、プログラムの叫び書き込みを最初と最後の名前を提供している場合:私は、次のしている

Welcome, Anonymous Person! 

Welcome, <FIRST> <LAST>! 
;; <FIRST> = "Julius", <LAST>= "Caesar" 
Welcome, Julius Caesar! 

そうでなければ、プログラムはとして指定されたデフォルト値、を参照してください私のコードの概要ですが、これを仕上げる方法に苦しんでいます。

(define (welcome . args) 
    (let (('first <user_first>/"Anonymous") 
     ('last <user_last>/"Person")) 
    (display (string-append "Welcome, " first " " last "!")))) 

使用例:

(welcome) ;;no arguments 
--> Welcome, Anonymous Person! 
(welcome 'first "John") ;;one argument 
--> Welcome, John Person! 
(welcome 'first "John" 'last "Doe") ;;two arguments 
--> Welcome, John Doe! 

すべてのヘルプは高く評価されます!

答えて

1

ラケットでは、これを行うにはkeyword argumentsを使用します。あなたは、キーワード引数私の文章#:keyword argument-id引数を宣言して関数を定義することができます:

あなたは、このように呼び出すことができます
(define (welcome #:first first-name #:last last-name) 
    (display (string-append "Welcome, " first-name " " last-name "!"))) 

> (welcome #:first "John" #:last "Doe") 
Welcome, John Doe! 

しかし、何がしたいことは、それらをオプションにすることです。これを行うには、引数宣言に#:keyword [argument-id default-value]と書くことができます。

(define (welcome #:first [first-name "Anonymous"] #:last [last-name "Person"]) 
    (display (string-append "Welcome, " first-name " " last-name "!"))) 

特定の関数呼び出しでそのキーワードを使用しないと、デフォルト値が設定されます。

> (welcome) 
Welcome, Anonymous Person! 
> (welcome #:first "John") 
Welcome, John Person! 
> (welcome #:first "John" #:last "Doe") 
Welcome, John Doe! 
> (welcome #:last "Doe" #:first "John") 
Welcome, John Doe! 
+0

を指定することができ、いずれの順序

  • で呼び出すことができます。 – Zelphir

  • +1

    私はそれに任意の数の引数を取るつもりはありませんでした。もしあなたがそれを必要とすれば '(define(welcome#:first first-name#:last last-name。rest-args)...) ' –

    0

    @Alex Knauthの答えは素晴らしいです。それは私が知らなかったことです。それはこれがあなたの基本的な要件

    > (welcome) 
    Welcome, Anonymous Person! 
    > (welcome "John") 
    Welcome, John Person! 
    > (welcome "John" "Doe") 
    Welcome, John Doe! 
    

    でかなりうまく動作

    (define (welcome (first "Anonymous") (last "Person")) 
        (displayln (string-append "Welcome, " first " " last "!"))) 
    

    ほど柔軟ではありませんけれどもここ

    は、代替だが、アレックスのソリューションは、2つの利点があります。

    1. 引数が最後の名前は、これは、任意の数の引数を取ることはありません。最初の名前なし
    +1

    あなたの答えは、( "" (またはを(歓迎 (ラムダ引数 (文字列追加 "ようこそ" (または(assqに-REF引数初) "匿名") を定義し'定義することによって改善することができました最初の "John")(最後の "Doe")) 'を呼び出すことで、次のようになります。 –

    +1

    あなたはこの質問に別の答えとしてこれを提出する必要があります。いい選択肢ですが、私がキーワードをキーワードにしたければ、おそらくアレックスのソリューションを使用します。共有してくれてありがとう^ _ ^ – naomik

    関連する問題