反向操作加/减

时间:2017-11-30 17:15:23

标签: scheme racket

我想编写一个接收表达式的函数,然后替换所有" - "用" +"反之亦然,并在球拍中给我一个新的表达。

(define-struct anode (oper args))

(define (myapply f exl)
(cond
   [(symbol? f)
         ("swap cond and recurse rest")]))

(define (myeval ex)
    (cond [(number? ex) ex]
            [else (myapply (anode-oper ex) (anode-args ex))]))

...更新

(define (myapply f exl) 
   (cond [(symbol=? f ') 
             (+ (myeval (first exl) (myapply f (rest exl)))] 
         [(symbol=? f '+) 
             ( (myeval (first exl)) (myapply f (rest exl)))])) 

(define (myeval ex)
   (cond [(number? ex) ex]
         [else (myapply (anode-oper ex) (anode-args ex))]))

我得到了原始列表反面的正确答案......    (make-anode' *(list 3 3 4)) - > 10(使用加法是正确的)

我似乎无法复制表达式......

from - >至 (make-anode' *(list 3 3 4)) - > (制造阳极' +(3 3 4))

2 个答案:

答案 0 :(得分:1)

您可能会执行以下操作来转换S表达式:

(define (convert tree)
  (if (null? tree)
      null
      (if (cons? tree)
          (cons (convert (car tree)) (convert (cdr tree)))
          (case tree
            ((+) '-)
            ((-) '+)
            (else tree)))))

,例如

> (convert '(- 3 3 4))
'(+ 3 3 4)

然后使用eval的一些Racket魔术:

> (define-namespace-anchor anc)
> (define ns (namespace-anchor->namespace anc))
> (eval (convert '(- 3 3 4)) ns)
10
> (eval (convert '(+ 3 3 4)) ns)
-4

答案 1 :(得分:0)

使用表达式并将+替换为--替换为+的函数可能会被编写为简单的递归解析器:

(define (my-parser expr)
  (for/list ([i expr])                                                                                               
  (cond                                                                                                                                   
    ((eq? i '+) '-)                                                                                                                         
    ((eq? i '-) '+)                                                                                                                         
    ((list? i) (my-parser i)) 
    (else i))))

这可行的原因是因为racket / scheme / lisp表达式也是列表。值得注意的是,这具有一些可能使宏适合的情况。但是,由于问题是关于一个函数,这是一个函数,只要函数完成这项工作,通常最好使用函数而不是宏。