Попытка применить функцию в двух списках - PullRequest
1 голос
/ 10 декабря 2011

Я написал следующий код, чтобы применить функцию для двух списков, которые являются частью списка списков, но по какой-то причине я получаю #<void> значения в результате.

Код:

(define (applyFunc list) 
    (cond ((null? list) ())
          ((null? (cdr list)) (car list))
          (else (cons (func (car list) (car (cdr list))) 
                (applyFunc (cdr (cdr list)))))))

func - это функция, которая применяет функцию к двум заданным спискам

. Что я получаю от трассировки моего кода:

>(applyFunc '((1) (1 1) (1 1 1) (1 1 1 1)))

> (applyFunc '((1 1 1) (1 1 1 1)))

> >(applyFunc '())

< <'()

< '(#<void>)

<'(#<void> #<void>)

(#<void> #<void>)

[при условииввод был '((1) (1 1) (1 1 1) (1 1 1 1))]

Ответы [ 2 ]

4 голосов
/ 10 декабря 2011

Пара ошибок, о которых нужно позаботиться в первую очередь:

  • Не следует называть list параметром процедуры (или чем-то еще в этом отношении), поскольку это встроенная процедура вСхема и вы перезаписываете ее.
  • В первом случае обычно возвращается '(), а не ()

Кроме этого, ваша процедура работает нормально:

(define (applyFunc lst) 
  (cond ((null? lst) '())
        ((null? (cdr lst)) (car lst))
        (else (cons (func (car lst) (car (cdr lst))) 
                    (applyFunc (cdr (cdr lst)))))))

Возможно, проблема в процедуре func, убедитесь, что она действительно работает с двумя списками.Я проверил ваш код с этим, и он работал без проблем:

(define (func l1 l2)
  (append l1 l2))
0 голосов
/ 13 декабря 2011

Я согласен с Оскаром, выше. Основная проблема с вашим кодом заключалась в том, что в пустом случае вы возвращали () вместо '().

С точки зрения ваших соглашений об именах, list технически должен работать просто отлично, но, как упоминал Оскар, обычно считается плохим риск переписать встроенную процедуру.

Я обновил код, изменив () на '(), и он работал без нареканий. * * 1010

...