В предоставленном вами коде есть несколько странностей, которые я отформатировал для удобства чтения:
(define (iota1 n m)
(if (eq? n 0)
'()
(append (iota (< n m) (+ n 1))
(list n))))
Во-первых, выражение (< n m)
оценивается как логическое значение в зависимости от того, меньше ли n
m
или нет. Когда вы применяете iota
к (< n m)
в выражении (iota (< n m) (+ n 1))
, вы даете iota
логическое значение для первого аргумента вместо положительного целого числа.
Во-вторых, использование append
здесь странно. При построении списка в Racket гораздо чаще используется функция cons
, которая принимает в качестве аргументов значение и список и возвращает новый список со значением, добавленным вперед. Например,
(append '(3) (append '(4) (append '(5) '()))) ==> '(3 4 5)
(cons 3 (cons 4 (cons 5 '()))) ==> '(3 4 5)
Рекомендуется использовать cons
вместо append
, потому что это проще и быстрее, поскольку cons
не пересекает весь список, как append
.
Поскольку это звучит как домашняя задача, я оставлю вам «шаблон кода», чтобы помочь вам найти ответ:
; n : integer
; m : integer
; return value : list of integers
(define (iota1 n m)
(if (> n m) ; base case; no need to do work when n is greater than m
... ; value that goes at the end of the list
(cons ... ; the value we want to add to the front of the list
(iota1 ... ...)))) ; the call to iota, generating the rest of the list