【问题标题】:How to rewrite code from Lisp to Scheme?如何将代码从 Lisp 重写为 Scheme?
【发布时间】: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 racketcadr,不是吗?
  • 用过,但我不能用。这些是工作的条件。谢谢:)
  • 啊,好吧,但是你似乎知道如何处理这个问题:只需按照字母 a 和 d 使用 car 和 cdr 的链式应用程序:例如 caddar -> (car (cdr (cdr(汽车。

标签: scheme racket


【解决方案1】:

你可以用number?代替numberp,然后写

(define (func arg1 arg2 ...) ...)

代替(defun func (arg arg2 ...) ...)

另外,不要将反引号 ` 替换为简单的引用 '。保留它。

【讨论】:

    猜你喜欢
    • 2018-11-15
    • 1970-01-01
    • 2017-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-18
    • 2018-04-15
    • 2014-10-22
    相关资源
    最近更新 更多