Форма if
состоит из 4 частей:
- Слово
if
. - Условие.
- Тогдашняя ветвь.
- Другая ветвь.
Ваша if
-форма, однако, состоит из 6 частей.(= (length original) 0)
это условие.left
- это ветвь then, а (append left (car original))
- ветвь else.Но какими должны быть две другие?Для читателя очевидно, что они все еще должны быть частью else-ветви, но компилятор не может этого знать.Насколько знает компилятор, вы с таким же успехом могли и для left
и (append left ...)
перейти в ветвь then, а для двух других - в ветвь else
.
Если выЕсли вы хотите выполнить несколько выражений внутри if
, вам нужен какой-то способ сгруппировать выражения, принадлежащие одной ветви.Вы делаете это, используя begin
следующим образом:
(if condition
(begin
(do-something-in-the-then-branch)
(do-something-else-in-the-then-branch))
(begin
(do-something-in-the-else-branch)
(do-something-else-in-the-else-branch)))
Однако в вашем случае это не поможет, потому что append
не работает на месте.Т.е. если вы сделаете (append left (car original))
, значение left
фактически не изменится.Вместо этого append
вернет новый список, содержащий содержимое left
и (car original)
без фактического изменения любого из списков.Таким образом, чтобы использовать результат append
, вам нужно использовать его возвращаемое значение.
Поэтому, чтобы ваша функция работала, вы должны либо передать вызовы для добавления непосредственно в качестве аргументов partition
или используйте let
, чтобы присвоить результаты переменным и передать переменные partition
.