# define a procedure 'flatten' that takes a list 'sequence'
(define (flatten sequence)
# if the 'sequence' is empty, return an empty list
(cond ((null? sequence) (list))
# if the first element of 'sequence' is itself a list, return a new list
# made by appending the flattened first element of 'sequence' with the
# flattened rest of the 'sequence'
((list? (car sequence))
(append (flatten (car sequence))
(flatten (cdr sequence))))
# if the first element of 'sequence' is not a list, return a new list
# made by cons-ing that element with the flattened rest of the 'sequence'
(else
(cons (car sequence)
(flatten (cdr sequence))))))
Я красиво напечатал его (вставил несколько новых строк и отступ для кода, чтобы показать его структуру), а также заменил '()
на (list)
(который имеет то же значение), чтобы предотвратить неправильное выделение кода. *
+ 1 что есть? Буду признателен, если вы объясните и другие ключевые слова. спасибо
Когда я говорю «против», я просто имею в виду процедуру cons
. Когда вы видите (cons <expression> <list>)
, где <expression>
- любое выражение или значение Схемы, а <list>
- любое выражение Схемы, которое вычисляется в виде списка, cons
вернет <list>
со значением <expression>
, прикрепленным на передней панели. Например, (cons 1 (list 2 3 4))
возвращает список (list 1 2 3 4)
. На самом деле, (list 1 2 3 4)
в Схеме - это всего лишь короткий способ написания (cons 1 (cons 2 (cons 3 (cons 4 '() ))))
.
Двумя другими словами, с которыми у вас могут возникнуть проблемы, являются car
и cdr
. Вы можете думать о (car <list>)
как о значении первый элемент или голова из <list>
и (cdr <list>)
как о значении rest элементов или хвост из <list>
. Например, (car (list 1 2 3 4))
возвращает значение 1
, а (cdr (list 1 2 3 4))
возвращает список (list 2 3 4)
.
Если вам нужна помощь с другими ключевыми словами, сообщите мне.