我想编写一个接收表达式的函数,然后替换所有" - "用" +"反之亦然,并在球拍中给我一个新的表达。
(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))
答案 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表达式也是列表。值得注意的是,这具有一些可能使宏适合的情况。但是,由于问题是关于一个函数,这是一个函数,只要函数完成这项工作,通常最好使用函数而不是宏。