あなたが何を求めているのかは分かりません。異なるタイプの引数を扱うことができる単一のプロシージャが必要ですか?
(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]))
ありがとうございます。私はそれを少し明確にしましょう。 以下はオペランド "+" " - " "*" "/" "(" ")" "オペランド"という名前にすべてを単純にバインドすることができるかどうかを知りたい場合 リスト "3 + 4 - 6"を介して+と - を "オペランド"として認識します。 これの目標は、リスト内の文字に対してトークン名を与えるレクサーを作成することです。 – Ceelos
@Ceelosあなたの入力は何ですか?単一の文字列ですか?文字列のリスト?スキームフォーム? – oobivat
どんな文字列でもやりますが、実際のプロジェクトではtxtファイルから読み込んでリストにします。私はそれを行う方法を知っています。 (ファイルを定義する (ファイル - >リスト "blah.txt")) – Ceelos