2016-11-08 2 views
0

В «Царстве Ракетки» авторы создают встроенную функцию для образовательных целей.Версия Ormap в «Realm Of Racket»

Их реализация ormap является:

(define (my-ormap-book pred lst) 
    (cond [(empty? lst) #f] 
     [else (or (pred (first lst)) 
        (my-ormap-book pred (rest lst)))])) 

Этот код кажется, работает хорошо во многих случаях, как блок-тесты сильфона шоу:

(require rackunit) 
(check-equal? (my-ormap-book add1 '(3 4 5)) 4) 
(check-equal? (my-ormap-book add1 '()) #f) 
(check-equal? (my-ormap-book positive? '(1 2 a)) #t) 

Однако реальная Ormap, как рэкет документация показывает - link - также работает с двумя или более списками в качестве входов, например:

(check-equal? (ormap + '(1 2 3) '(4 5 6)) 5) 

При выполнении этого теста с «Обители» ракетка с реализации, вы получите:

(check-equal? (my-ormap-book + '(1 2 3) '(4 5 6)) 5) 

my-ormap-book: arity mismatch; 
the expected number of arguments does not match the given number 
    expected: 2 
    given: 3 
    arguments...: 

Как решить эту проблему? Как мне сделать процедуру «my-ormap-book» на этом тестовом примере?

ответ

0

Вы правы, что встроенный ormap обрабатывает несколько списков. Думаю, я бы отделил ваш вопрос на два вопроса. Во-первых: как вы определяете функцию, которая принимает переменное количество аргументов (известное как «variadic»)? Во-вторых: как вы определяете переменную ormap?

В ответ на первое: существует несколько способов определения вариационных функций. Проще всего использовать точку в списке аргументов, до последнего аргумента:

(define (f a b . rest-args) 
    (first rest-args)) 

Все аргументы после первых двух сгруппированы в список с заданным именем.

Эта абсолютно бесполезная функция принимает два или более аргумента и возвращает третий (нормально, бессмысленно и сломан).

В ответ на ваш другой вопрос ... ну, это вопрос одновременной рекурсии по нескольким спискам одинаковой длины, и я думаю, что я отсылаю вас к section 23.1 of HtDP 2e.

Смежные вопросы