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