あなたが何を求めているのかよくわかりません。さまざまなタイプの引数を処理できる単一のプロシージャが必要ですか?
(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]))