我在计算时遇到问题("A" 1 2)
执行此操作的规范方法是使用符号,而不是字符串:
> (define a +)
> (a 1 2)
3
> +
#<procedure:+>
> a
#<procedure:+>
在这里,符号a
绑定到符号+
绑定(并保持)的相同过程,这意味着+
和a
可以互换使用。
如果需要使用字符串,可以使用使用查找表将字符串转换为过程的过程:
(define (s->p str)
(cdr (assoc str (list (cons "A" +) (cons "S" -)))))
像这样使用:
> ((s->p "A") 1 2)
3
如果你正在制作自己的解释器,那么你将有一个assoc列表来将名称映射到实际的实现。例如。
(define env `(("a" . ,+) ("m" . ,-) ("id" ,(lambda (x) x))))
(define (string->value sym env)
(let ((v (assoc sym env)))
(if v ; v is #f when not found
(cdr v)
(error "Variable not found"))))
((string->value "a" env) 4 5) ; ==> 9
使用符号实际上更常见,但我可以想到所有值都是字符串的实现。
#lang racket
(define (combine sign)
(cond ((equal? "A" sign) +)
((equal? "S" sign) -)))
((combine "A") 1 2)
也:
#lang racket
(define env
(list (cons "a" +) (cons "m" -)))
(define (combine target env)
(define (search env)
(if (null? env)
(begin (displayln "not found and the default operate is +") +)
(if (equal? target (car (car env)))
(cdr (car env))
(search (cdr env)))))
(search env))
((combine "2" env) 1 2 3 4)