我不确定你在问什么。您想要一个可以处理不同类型参数的过程吗?
(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
如果您不澄清您正在尝试做什么,将很难提供更多帮助。
编辑:在您发表评论后,我对您正在寻找的东西有了更好的了解。无法按照您的意思将多个值绑定到同一个名称。您正在寻找一个谓词,它会告诉您正在查看的东西是否是您的运算符之一。从您的评论看来,您将接受一个字符串,这就是它的基础:
(define (operator? x)
(or (string=? "+" x) (string=? "-" x) (string=? "*" x) (string=? "/" x)))
如果您要接收单个字符串,则需要将其拆分为较小的部分。Racket 有一个内置的程序regexp-split
可以为你做这件事。
(define str-lst (regexp-split #rx" +" [input str]))