Как разбить список Scheme на аргументы для передачи в процедуру? - PullRequest
4 голосов
/ 16 мая 2011

Я хочу использовать предопределенную функцию (max) (R5RS) с list числами, длина которых варьируется.К сожалению, (max) принимает входные данные следующим образом:

(max 2 43 5 6)
=> 43

Я пытаюсь использовать его следующим образом:

(define lst '(3 5 53 4 53 54 32))
(max lst)

Это приводит к следующей ошибке.

max: expects argument of type <real number>; given (3 5 53 4 53 54 32)

Как я могу разбить этот список на отдельные аргументы, которые мне нужны, так как я передаю их (max)?

Ответы [ 3 ]

6 голосов
/ 16 мая 2011

Вы можете рассмотреть возможность использования apply (хотя имейте в виду, что это может накладывать ограничения на число допустимых элементов / аргументов, в зависимости от вашей реализации Схемы):

(apply max '(3 4 2 1 78 2 1))

В общем, если неизвестно, что число элементов мало, было бы безопаснее сделать это вручную:

(define max* (list)
    (if (null? list) (negative-infinity)
        (let loop ((list (cdr list)) (best (car list)))
            (if (null? list) best (loop (cdr list) (max best (car list)))))))
1 голос
/ 20 мая 2011

Использование apply в основном означает выполнение (max 3 4 2 1 78 2 1), но число аргументов, которые может быть передана процедуре, не бесконечно в некоторых системах. Для max вы можете воспользоваться его коммутативностью, используя fold:

(fold-left max -inf.0 '(3 4 2 1 78 2 1))
0 голосов
/ 29 апреля 2013

Вы можете написать процедуру, которая сравнивает первый элемент со вторым,

(define (largestele lst)
        (if (null? (cdr lst))
            (car lst)
            (if (> (car lst) (cadr lst))
                (largestele (cons (car lst) (cddr lst)))
                (largestele (cdr lst)))))
...