如何将运算符分配给方案中的字符串?(例如:"A" == + 、"S" == -等)我在计算时遇到问题 ( "A" 1 2)



我在计算时遇到问题("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)

相关内容

  • 没有找到相关文章

最新更新