球拍中的代码出错

时间:2015-07-29 21:04:43

标签: functional-programming scheme racket

我有这段代码,但是我收到了这个错误:

application: not a procedure;
  That procedure can expected to be applied to arguments
    given: '(8 1 2 3 4 5)
    arguments .:

我试图修复它,但仍然没有结果。

此函数应返回一个新列表,在列表中包含的名为“indices”的相应位置插入名为“listas”的列表元素。

(define (insertar posicion elemento lista)
  (cond ((= posicion 0) (cons elemento lista))
     (else (cons (car lista) (insertar (- posicion 1) elemento (cdr lista))))
  )
)

(define multi-insertar (lambda (lista listas indices)
                         (if (not (eq? (length listas) (length indices)))
                             "Numero de indice no es igual a numero de listas a ingresar"
                             (if (= 1 (length indices))
                                 (insertar (car indices) (car listas) lista)
                                 ((insertar (car indices) (car listas) lista)
                                  (multi-insertar lista (cdr listas) (cdr indices))
                                 )
                              )
                         )
                        )
)

2 个答案:

答案 0 :(得分:2)

您可能想要做的是:

(define (multi-insertar lista listas indices)
  (if (not (eq? (length listas) (length indices)))
      "Numero de indice no es igual a numero de listas a ingresar"
      (if (= 1 (length indices))
          (insertar (car indices) (car listas) lista)
          ;; only the following branch is changed
          (insertar (car indices) (car listas)
                    (multi-insertar lista (cdr listas) (cdr indices))))))

所以现在multi-insertarinsertar的末尾开始使用lista插入所有元素。

评论:

elementoslistas

的更好名称

当指数按降序排列时,这只能按预期工作。比较以下两个例子:

> (multi-insertar '(a b c d e f) '(x y z) '(1 3 5))
=> (a x b c y d e z f)
> (multi-insertar '(a b c d e f) '(z y x) '(5 3 1))
=> (a x b y c z d e f)

答案 1 :(得分:0)

multi-insertar的6.和7.行中:

(let ((operator (insertar (car indices) (car listas) lista))
      (argument (multi-insertar lista (cdr listas) (cdr indices))))
 (operator argument)) ; operator must be a procedure for this to work!

我已将这两个表达式放在let中,以使其更具可读性。错误说的是operator的值不是一个过程,但列表(8 1 2 3 4 5)('(8 1 2 3 4 5) argument)对评估者没有意义。

但是这样的代码确实有意义,因为变量operator是一个过程:

(let ((operator (if (< x 1) * /))
  (operator x 10)) ; we either divide or multiply by 10.