【问题标题】:Convert code from Common Lisp to Scheme将代码从 Common Lisp 转换为 Scheme
【发布时间】:2016-04-21 15:26:05
【问题描述】:

我在 Common Lisp 中编写了一个程序,并试图让它在 Scheme 中也能工作,但它不工作。我是 Scheme 和 MIT/GNU Scheme 的新手。 这是 Common Lisp 中的代码。它在 Lispworks 中运行良好:

(defun removeAdjc (L) (cond ((null L) L)
      (t (cond ((equal (car L) (cadr L)) (removeAdjc (cdr L))) 
         (t (append (list (car L)) (removeAdjc (cdr L))))))))

这是我用于 Scheme 的代码:

(define (removeAdjc L)
     (if (null? L) L
        (if (equal? (car L) (cadr L)) (removeAdjc (cdr L))
              (append (list (car L)) (removeAdjc (cdr L)))
           ) ))

这是我在 MIT/GNU Scheme 上尝试时得到的结果:

【问题讨论】:

    标签: scheme lisp common-lisp mit-scheme


    【解决方案1】:

    错误的原因是你只检查列表的末尾,(null? L),而你也应该检查列表是否有一个元素(因为你正在做(cadr L))。所以正确的定义可能是:

    (define (removeAdjc L)
      (cond ((null? L) L)
            ((null? (cdr L)) L)
            ((equal? (car L) (cadr L)) (removeAdjc (cdr L)))
            (else (cons (car L) (removeAdjc (cdr L))))))
    

    请注意,在 Common Lisp 中,(cadr nil) 返回 nil,这就是错误不会出现在该语言中的原因。

    【讨论】:

      【解决方案2】:

      在 Common Lisp 中,使用 ()(又名 nil)的 car 和 cdr 是合法的:(car '()) 是 (),同样适用于 cdr。在 Scheme 中情况并非如此。特别是,在您的代码中,您试图在没有首先检查 cdr 是否为 () 的情况下获取 cadr:您需要检查它。

      【讨论】:

        猜你喜欢
        • 2018-11-15
        • 1970-01-01
        • 1970-01-01
        • 2021-09-09
        • 2016-08-27
        • 1970-01-01
        • 2016-08-30
        • 1970-01-01
        • 2013-12-03
        相关资源
        最近更新 更多