2017-01-31 8 views
0

私はプロシージャを作成するためのドットを知っています。これは任意の量の引数を取ることができますが、他の場所でドットを使用するいくつかの例を見ました。一つの例は、csv-readingdocsからである:これは設定パラメータのリストのように見えるドットはラケットで何をするのですか?

(define next-row 
    (make-csv-reader 
    (open-input-file "fruits.csv") 
    '((separator-chars   #\|) 
    (strip-leading-whitespace? . #t) 
    (strip-trailing-whitespace? . #t)))) 

私には「セット」ですが、ドットが何をするのでしょうか?

別の例は、同様に(formletセクション)docsからWebアプリケーションのチュートリアルからです:

; new-post-formlet : formlet (values string? string?) 
; A formlet for requesting a title and body of a post 
(define new-post-formlet 
    (formlet 
    (#%# ,{input-string . => . title} 
     ,{input-string . => . body}) 
    (values title body))) 

この例では私の推測で、ドットが何とか=>を書くことができていること中置演算子として。私はリストの前に=>を置くことができ、ドットを離れたままにして、それはまだある時点で働いていました。私はチュートリアルのコードの最終版で試していませんでした。 しかし、この「中断」は最初の例に適合しないと私は思う。

答えて

1

dotは一意にラケットのものではなく、lispのものです。リストはペアで作成され、一方のペアはリテラルフォーム(car . cdr)を持ち、2, 3のリストは(2 . (3 .()))のように構成されていますが、読者はこれを読むことができますが、cdrというペアを持つリストはドットなしで表示できます(2 . (3 .()))(2 3 .())と同じになるような括弧を使用します。また、最後に特殊な空のリストを持つドットを省略すると、(2 3)はどのように読むことができ、displayとREPLがそれを印刷する唯一の方法です。

cdrとしてペアまたはヌルがないとどうなりますか?そしてそれを表現する唯一の方法は点在したものです。 (2 . (3 . 5))では、最初のドットは簡略化できるので(2 3 . 5)です。

リテラルデータ構造は、carがキーであり、cdrが値である要素としてペアを持つassocのように見えます。新しいペアを使用すると、スペースが無駄になります。

パラメタリストとして、インタプリタは要素を調べ、それがペアの場合はcarのシンボルをバインドしますが、ペアでない場合はnullで終了するか、残りの引数シンボルがあります。それを表現するのが便利な方法です。 Common LispはSchemeやClojureよりも多くの機能をサポートしているため、ドットスペアを持たないClojureは&要素を使用します。

2番目は#lang racketであり、実際にはインフィックスをサポートするために使用されています。 (5 . + . 6)と書いた場合、読者の評価は評価される前に(+ 5 6)に変更されます。それは、それが引用されています場合でも同様または実際のコードを動作し、二つ目は、実際になるようにカーリーはもちろん、通常と四角括弧に等しい:

(define new-post-formlet 
    (formlet 
    (#%# ,(=> input-string title) 
     ,(=> input-string body)) 
    (values title body))) 

あなたはラケット(5 . + . 6)#!r5rsまたは#!r6rsを使用した場合得られますあなたは読み取りエラーです。

+0

私は引数を指定するだけで新しい構造体を構築しないので、 '(something。somethingelse)'との関連付けを書くときに新しいメモリは必要ないので、この場合は新しいペアが無駄です。しかし、ペアを作成すると、そのペアのメモリの割り当てが強制されます。私はこれを正しく理解しましたか? – Zelphir

+1

@Zelphirほとんどの '(something。somethingelse)'は1組だけを使用していますが、 '(something something)'は2つを使用しています。スペースを2倍、パスを2倍にして 'somethingelse 'にしようとしていますが、今日はこれほど重要ではありませんでした。現在はキロバイトしか使えないので、今日はもっと習慣があります。読者は必要以上に習慣からそれをやりました。 – Sylwester

関連する問題