【发布时间】:2018-04-22 18:16:28
【问题描述】:
无法将代码从Lisp语言改写成Scheme语言,出现错误,求助纠正。
例如(cadr x) 等价于(car (cdr x))
一个函数(cadr x)等价于(car (cdr x)),不知道怎么解释numberp函数。
Lisp 代码:
(defun deriv (f x)
(cond ((numberp f) 0)
((eq f x) 1)
((eq (car f) '+) `(+ ,(deriv (cadr f) x) ,(deriv (caddr f) x)))
((eq (car f) '-) `(- ,(deriv (cadr f) x) ,(deriv (caddr f) x)))
((eq (car f) '*) `(+ (* ,(caddr f) ,(deriv (cadr f) x)) (* ,(cadr f) ,(deriv (caddr f) x))))
((eq (car f) '^) `(* (* ,(caddr f) (^ ,(cadr f) (- ,(caddr f) 1))) ,(deriv (cadr f) x)))))
我是如何尝试在 Scheme 上编写这段代码的:
(define deriv (f x)
(cond
((eq? f x) 1)
((eq? (car f) '+) '(+ ,(deriv (car (cdr f) x)) ,(deriv (car (cdr (cdr f) x)))))
((eq? (car f) '-) '(- ,(deriv (car (cdr f) x)) ,(deriv (car (cdr (cdr f) x)))))
((eq? (car f) '*) '(+ (* ,(car (cdr (cdr f))) ,(deriv (car (cdr f) x))) (* ,(car (cdr f)) ,(deriv (car (cdr (cdr f) x))))))
((eq? (car f) '^) '(* (* ,(car (cdr (cdr f))) (^ ,(car (cdr f)) (- ,(car (cdr (cdr f))) 1))) ,(deriv (car (cdr f)) x)))))
发生错误
define: bad syntax (multiple expressions after identifier) in: (define deriv (f x) (cond ((eq? f x) 1) ((eq? (car f) (quote +)) (quote (+ (unquote (deriv (car (cdr f) x))) (unquote (deriv (car (cdr (cdr f) x))))))) ((eq? (car f) (quote -)) (quote (- (unquote (deriv (car (cdr f) x))) (unquote (deriv (car (cdr (cdr f) x))))))) ((eq? (car f) (quote *)) (quote (+ (* (unquote (car (cdr (cdr f)))) (unquote (deriv (car (cdr f) x)))) (* (unquote (car (cdr f))) (unquote (deriv (car (cdr (cdr f) x)))))))) ((eq? (car f) (quote ^)) (quote (* (* (unquote (car (cdr (cdr f)))) (^ (unquote (car (cdr f))) (- (unquote (car (cdr (cdr f)))) 1))) (unquote (deriv (car (cdr f)) x)))))))
附言对不起我的英语
【问题讨论】:
-
您使用什么语言 (
#lang)? -
使用#lang 球拍
-
#lang racket有cadr,不是吗? -
用过,但我不能用。这些是工作的条件。谢谢:)
-
啊,好吧,但是你似乎知道如何处理这个问题:只需按照字母 a 和 d 使用 car 和 cdr 的链式应用程序:例如 caddar -> (car (cdr (cdr(汽车。