2012-05-06 9 views
-1

私はどこかで、複数の定義をスキーム内の単一の名前にバインドできると読んでいると思います。私は誤って用語を使用している可能性があることを知っています。これにより、次のことが可能になることを意味します(演算子を定義することは本当に便利でしょう)。複数の定義をスキームの1つの "変数"にバインドしますか?

は私がすべてのオペレータに対して別の変数をテストしたい(私はこれが本当の構文ではありません知っている)

(let() 
define operator "+" 
define operator "-" 
define operator "*" 
define operator "/")) 

私はこのような何かを読んで考えています。

答えて

1

あなたが何を求めているのかは分かりません。異なるタイプの引数を扱うことができる単一のプロシージャが必要ですか?

(define (super-add arg1 arg2) 
    (cond ((and (string? arg1) (string? arg2)) 
     (string-append arg1 arg2)) 
     ((and (number? arg1) (number? arg2)) 
     (+ arg1 arg2)) 
     (else 
      (error "UNKNOWN TYPE -- SUPER-ADD")))) 

(super-add "a" "b") => "ab" 
(super-add 2 2) => 4 

メッセージパッシングに興味がありますか?

(define (math-ops msg) ;<---- returns a procedure depending on the msg 
    (cond ((eq? msg 'add) +) 
     ((eq? msg 'sub) -) 
     ((eq? msg 'div) /) 
     ((eq? msg 'multi) *) 
     (else 
      (error "UNKNOWN MSG -- math-ops")))) 

((math-ops 'add) 2 2) => 4 
((math-ops 'sub) 2 2) => 0 

また結合letのための適切な構文:

(let (([symbol] [value]) 
     ([symbol] [value])) 
    ([body])) 

(let ((a 2) 
     (b (* 3 3))) 
    (+ a b)) 

=> 11 

それはあなたがそれはあなたがやろうとしているが何であるかを明確にすることなく、これ以上のものを助けて非常に難しいでしょう。

編集:あなたのコメントの後、私は少しあなたが探しているもののアイデアを持っています。同じ名前に複数の値をバインドする方法はありません。あなたが探しているものがあなたの演算子の1つであるかどうかを示す述語を探しています。

(define (operator? x) 
    (or (string=? "+" x) (string=? "-" x) (string=? "*" x) (string=? "/" x))) 

あなたは、単一の文字列に取っているなら、あなたはより小さな部分に分割する必要があります:あなたは、文字列に服用されるようにそれはこれが基づいているものですので、あなたのコメントからは、見えました。ラケットには、これを行うための手順regexp-splitが組み込まれています。

(define str-lst (regexp-split #rx" +" [input str])) 
+0

ありがとうございます。私はそれを少し明確にしましょう。 以下はオペランド "+" " - " "*" "/" "(" ")" "オペランド"という名前にすべてを単純にバインドすることができるかどうかを知りたい場合 リスト "3 + 4 - 6"を介して+と - を "オペランド"として認識します。 これの目標は、リスト内の文字に対してトークン名を与えるレクサーを作成することです。 – Ceelos

+0

@Ceelosあなたの入力は何ですか?単一の文字列ですか?文字列のリスト?スキームフォーム? – oobivat

+0

どんな文字列でもやりますが、実際のプロジェクトではtxtファイルから読み込んでリストにします。私はそれを行う方法を知っています。 (ファイルを定義する (ファイル - >リスト "blah.txt")) – Ceelos

0

あなたは「継続に引数を提供する」values構築物を参照することができます。これは、関数から複数の値を返すために使用できます。たとえば、

(define (addsub x y) 
    (values (+ x y) (- x y))) 

(call-with-values 
    (lambda() (addsub 33 12)) 
    (lambda (sum difference) 
    (display "33 + 12 = ") (display sum) (newline) 
    (display "33 - 12 = ") (display difference) (newline))) 
+0

ええ、私は 'values' /' call-with-values'が忘れています。 Ceelosのコメントや他の質問を見ると、おそらく彼らが探しているものではないでしょう... – oobivat

関連する問題