Если вы посмотрите подпись (контракт) build-list
1 , вы увидите, что это
build-list : Nat (Nat -> X) -> (listof X)
Таким образом, требуется (натуральное) число, а затем функция , которая ожидает натуральное число и возвращает элемент типа (X), который вы хотите включить в список.Итак, в вашем случае, каким конкретным типом вы хотите, чтобы X был для каждого звонка, который вы делаете, на build-list
(в каждом случае он может быть разным).В случае внутреннего build-list
похоже, что вы пытаетесь составить список posn
с.Однако (make-posn y x)
немедленно создает один posn
и не является функцией, которую ожидает build-list
.Поэтому, так же как вы предоставляете функцию (lambda (x) ...)
для внешней build-list
, вы также должны предоставлять функцию (lambda (...) ...)
для внутренней функции.
Выбор имени x
для параметра первого lambda
может быть немного запутанным.Что я могу сделать, так это изменить имя параметра функции new-board
на N, так как кажется, что вы хотите создать доску из N
строк (и столбцов).И цель первого build-list
- создать каждую из этих строк (или столбцов, в зависимости от того, как вы хотите об этом думать).Так что, если у вас было:
(define (new-board N)
(build-list N (lambda (x) ...)))
И затем вы используете это как:
(new-board 5)
, это уменьшит / упростит / оценит следующим образом:
==> (build-list 5 (lambda (x) ...))
==> (list ( (lambda (x) (build-list ... x ...)) 0 )
( (lambda (x) (build-list ... x ...)) 1 )
( (lambda (x) (build-list ... x ...)) 2 )
( (lambda (x) (build-list ... x ...)) 3 )
( (lambda (x) (build-list ... x ...)) 4 )
==> (list (build-list ... 0 ...)
(build-list ... 1 ...)
(build-list ... 2 ...)
(build-list ... 3 ...)
(build-list ... 4 ...))
Такнет ничего плохого во вложении build-list
.Посмотрите, сможете ли вы теперь выяснить, как заставить внутренний сборочный список работать над созданием списка posns, если текущая строка зафиксирована в определенном x
значении.