我有这段代码,但是我收到了这个错误:
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))
)
)
)
)
)
答案 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-insertar
从insertar
的末尾开始使用lista
插入所有元素。
评论:
elementos
是listas
当指数按降序排列时,这只能按预期工作。比较以下两个例子:
> (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.