Вот ваш код с отступом, чтобы соответствующие элементы были визуально выровнены:
(define (partition lst item)
(define (partition-iter lst less same greater)
(cond
((null? lst)
(list less same greater ))
((< (car lst) item)
(partition-iter (cdr lst)
(cons (car lst) less)
same
greater))
((= (car lst) item)
less
(cons (car lst) same)
(else
(partition-iter (cdr lst)
(cons (car lst) greater))))))
(partition-iter lst '() '() '()))
Я думаю, вы сразу видите, что с этим что-то не так, сейчас. Это асимметрично, все не так, даже если скобки сбалансированы. Предложение else
внутри другого предложения cond
? Что это это??
Мораль такова: не бойтесь использовать пустое пространство, чтобы лучше видеть. Много-много пустого пространства.
Без него Scheme имеет тенденцию выглядеть как непроницаемая стена слов, скобок или без скобок. И рекомендуемый стиль отступа. Делает. Нет. Помощь.
Исправление очевидное, минимальное и простое: просто завершите код в том же стиле, который вы (??) начали его писать. Обработайте два других случая, построив три промежуточных списка, проходя по входному списку, повторяя cdr
в каждом из трех случаев:
(define (partition lst item)
(define (partition-iter lst less same greater)
(cond
((null? lst)
(list less same greater ))
((< (car lst) item)
(partition-iter (cdr lst)
(cons (car lst) less)
same
greater ))
((= (car lst) item)
(partition-iter (cdr lst)
less
(cons (car lst) same)
greater ))
(else ; (> (car lst) item) ; keep it here for documentation!
(partition-iter (cdr lst)
less
same
(cons (car lst) greater) )) ))
(partition-iter lst '() '() '()))
Теперь мне даже не нужно загружать его в DrRacket, чтобы убедиться, что все в порядке.
Симметрия красивая. Симметрия правильная.
Кстати, в псевдокоде сопоставления с образцом с охранниками это можно было бы записать как
partition lst item = partition-iter lst [] [] []
where
partition-iter [] less same greater = [less, same, greater]
partition-iter [a, ...lst] less same greater
| a < item = partition-iter lst [a, ...less] same greater
| a == item = partition-iter lst less [a, ...same] greater
| else = partition-iter lst less same [a, ...greater]
что, я думаю, гораздо более наглядно. Переход туда и обратно между ним и правильной схемой — это вопрос чисто синтаксических преобразований.
person
Will Ness
schedule
03.04.2018
(= ...)
и терминelse
должны выглядеть так же, как термин(< ...)
, с той разницей, что вы указываете в другом месте. Прямо сейчас вы этого не делаете, и вашelse
является следствием срока(= ...)
. - person Sylwester   schedule 03.04.2018