对象___不适用

时间:2014-04-10 00:12:49

标签: scheme lisp

嗨我正在写第一个元素之后抓住每个第三个元素的东西。但是由于“对象(a b c d e f g)不适用,我无法测试逻辑。”代码如下,原子?检查它是否是列表,listful被定义为空列表。

(DEFINE (threes var)
    (if(atom? var)
        ((newline) (DISPLAY "Bad input")  ))
    (APPEND(listful (CAR var)))
    (if(> 3 (length var))
        (threes (cdddr(listful)))
        (listful))
)

有人能给我一些提示吗?以下是我在Scheme环境中调用方法的方法。

>(threes (list1))
>(threes '(A B C D E F))

1 个答案:

答案 0 :(得分:1)

if只能有一个表达式作为结果,另一个作为替代。如果您需要多个表达式,则必须使用begin来包含表达式序列 - 围绕()表达式的表达式,并且会导致报告错误,因为Scheme将()解释为函数应用程序。这将是正确的语法:

(define (threes var)
  (if (atom? var)
      (begin
        (newline)
        (display "Bad input")))
  (append (listful (car var)))
  (if (> 3 (length var))
      (begin
        (threes (cdddr (listful)))
        (listful))))

......然而,这不太可行。你想做的事情在最后几天被问过几次,特别是here是我自己以前的回答:

(define (threes lst)
  (cond ((or (null? lst) (null? (cdr lst))) lst)
        ((null? (cdr (cdr lst))) (list (car lst)))
        (else (cons (car lst)
                    (threes (cdr (cdr (cdr lst))))))))

例如:

(threes '(a b c d e f g h i j k l m n o p))
=> '(a d g j m p)

有关解决问题的其他方法,请参阅original question,并提供详细说明。