Scheme 反向运算加法/减法

Scheme 反向运算加法/减法,scheme,racket,Scheme,Racket,我想写一个函数,它接收一个表达式,然后用+替换所有-反之亦然,并在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 (

我想写一个函数,它接收一个表达式,然后用+替换所有-反之亦然,并在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))]))
我得到了与我原来列表相反的正确答案。。。 使用加法器制作正确的阳极“*列表3 4->10

但是我似乎无法复制这个表达

从->到
makeanode'*list334->makeanode'+334

接受表达式并用-替换+和用+替换的函数可以编写为简单的递归解析器:

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

之所以这样做是因为racket/scheme/lisp表达式也是列表。值得注意的是,它的一些特性可能使它成为适合宏的情况。但是,由于问题是关于函数的,因此这是一个函数,只要函数起作用,通常最好使用函数而不是宏。

您可以这样做来转换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)
然后使用一些球拍魔术来评估:


你试过了吗?你在坚持什么?您是否为您试图编写的函数提供了一个目的语句或测试用例?定义myapply f exl cond[symbol=?f'+myeval first exl myapply f rest exl][symbol=?f'+myeval first exl exl myapply f rest exl]我能够完成上述操作,并为我的新表达式获得一个结果。这与原文相反但是我似乎无法复制这个表达式。。。制作阳极'*列表3 3 4->制作阳极'+3 4
> (define-namespace-anchor anc)
> (define ns (namespace-anchor->namespace anc))
> (eval (convert '(- 3 3 4)) ns)
10
> (eval (convert '(+ 3 3 4)) ns)
-4