我正在尝试定义一个函数,它在一个sexpr in scheme中标记尾部和非尾部调用。 它的定义如下:
TCS ::= SYMBOL | NUMBER | IF | FUNCTION-CALL
IF ::= (if TCS TCS TCS)
FUNCTION-CALL ::= (TCS TCS...)
输入/输出的示例是:
(mark-tail-calls '(if (a (b c)) (e (f g) h) i) (j (k 7)))
=> (if (non-tail-call a (non-tail-call b c)) (non-tail-call e (non-tail-call f g) h) i) (tail-call j (non-tail-call k 7))
我理解尾部和非尾部调用之间的区别,但是考虑到我对方案的经验很少,我很难编写函数。任何帮助/指向正确方向的人都将不胜感激
答案 0 :(得分:0)
希望能帮助你入门:
您通常会对输入结构进行案例分析(并递归)。
的内容
(define (mark-tail-calls e)
(cond ((null? e) '())
((symbol? e) e)
((number? e) e)
((if? e) (list 'íf ...)
((symbol? (car e)) ...)
(#t ...))))
if?
定义为
(define (if? e)
(and (pair? e)
(equal? (car e) 'if)))