Написание общего назначения "сплит" функция (для выдуманных языках по SICP)


Из SICP 2.2.4:

Учебник уже определили функцию (право-сплит ...) следующим образом:

(define (right-split painter n)
  (if (= n 0)
      painter
      (let ((smaller (right-split painter (- n 1))))
        (beside painter (below smaller smaller)))))

и они показали, что существует процедура (до-сплит ...), который так же структуры.

Упражнения 2.45. Право-Сплит и до разделения может быть выражена как экземпляры общего расколку. Определить процедуру сплит с свойство, оценки

(define right-split (split beside below))
(define up-split (split below beside))

производит процедуры прямо-Сплит и вверх-сплит с таким же поведением как те, которые уже определены.

Я написал следующую функцию, но я не уверен, что лучший способ проверить его. Что вы думаете?

(define (split step1 step2)
  (define (split-f painter n)
    (if (= n 0)
        painter
        (let ((smaller (split-f painter (- n 1))))
          (step2 (step1 smaller smaller)))))
  split-f)

(define right-split (split beside below))
(define up-split (split below beside))


288
3
задан 15 апреля 2011 в 02:04 Источник Поделиться
Комментарии
1 ответ

Для того, чтобы проверить его, вы должны иметь определения для таких вещей, как рядом с и ниже. Есть что-то странное в учебнике код, потому что художник "меньше" на самом деле не масштабируется в коде, или это указано, что "под" и "рядом" масштаб своих рассуждениях? В любом случае, вы можете просто определить

  (define (below a b) `(below ,a, b))
(define (beside a b) `(beside ,a ,b))

так, например, (право-разделить яблоко 1) должен произвести в результате

  '(beside apple (below apple apple))

Вы можете проверить от структуры терминов, что ваш код работает правильно.

Ваш (сплит ...) функции есть ошибка, как "художник" отсутствует в строке, где вы называете "Шаг2". Код следует читать:

  (step2 painter (step1 smaller smaller))

Иначе это выглядит хорошо для меня.

3
ответ дан 15 апреля 2011 в 04:04 Источник Поделиться