История изменений
Исправление Norgat, (текущая версия) :
И тем не менее что функционального есть в clojure чего нет в cl?
Иммутабельность структур данных. Т.е. чтобы поменять значение элемента в списке нужно создать новый список с изменённым элементом. Аналогично со структурой, если хочешь структуру с изменённым полем - создавай новый инстанс структуры с изменённым полем, а старую менять нельзя.
Если очень нужно, то нужно использовать атомы, которые гарантируют отсутствие гонок в многопоточной программе.
В CL не так. Если создать структуру, то используя setf можно поменять значение поля in-place, как, скажем, в C или Java. Так же в CL есть массивы, которые меняются in-place и ведут себя как стандартные массивы из C (меняются через setf in-place).
А теперь посмотрим на Haskell, Erlang, OCaml - ЯП функциональная природа которых очевидна и заявлена создателями. Там никаких in-place преобразований не допускается, т.е. пересоздание структуры данных. В F# аналогично, для базовых структур данных (List, Set, Seq) и есть дополнительный синтаксис, если хочется поменять значение переменной (т.о. по дефолту классы написанные на F# тоже иммутабельны, а для мутабельности нужно явно это указать). Про Scala ничего не скажу - не знаю её.
P.S. иммутабельность важная штука, т.к. позволяет практически «бесплатно» (с точки зрения времени программиста и усложнения кода) параллелить код. Имхо, это одна из тех фишек функциональных ЯП, которая действительно интересна, т.к. map+filter+reduce можно и на Java какой-нибудь писать, если захотеть (и часто это делают см. Google Guava), но вот гарантий целостности данных это не даст никаких.
Исправление Norgat, :
И тем не менее что функционального есть в clojure чего нет в cl?
Иммутаьельность структур данных. Т.е. чтобы поменять значение элемента в списке нужно создать новый список с изменённым элементом. Аналогично со структурой, если хочешь структуру с изменённым полем - создавай новый инстанс структуры с изменённым полем, а старую менять нельзя.
Если очень нужно, то нужно использовать атомы, которые гарантируют отсутствие гонок в многопоточной программе.
В CL не так. Если создать структуру, то используя setf можно поменять значение поля in-place, как, скажем, в C или Java. Так же в CL есть массивы, которые меняются in-place и ведут себя как стандартные массивы из C (меняются через setf in-place).
А теперь посмотрим на Haskell, Erlang, OCaml - ЯП функциональная природа которых очевидна и заявлена создателями. Там никаких in-place преобразований не допускается, т.е. пересоздание структуры данных. В F# аналогично, для базовых структур данных (List, Set, Seq) и есть дополнительный синтаксис, если хочется поменять значение переменной (т.о. по дефолту классы написанные на F# тоже иммутабельны, а для мутабельности нужно явно это указать). Про Scala ничего не скажу - не знаю её.
P.S. иммутабельность важная штука, т.к. позволяет практически «бесплатно» (с точки зрения времени программиста и усложнения кода) параллелить код. Имхо, это одна из тех фишек функциональных ЯП, которая действительно интересна, т.к. map+filter+reduce можно и на Java какой-нибудь писать, если захотеть (и часто это делают см. Google Guava), но вот гарантий целостности данных это не даст никаких.
Исходная версия Norgat, :
И тем не менее что функционального есть в clojure чего нет в cl?
Иммутаьельность структур данных. Т.е. чтобы поменять значение элемента в списке нужно создать новый список с изменённым элементом. Аналогично со структурой, если хочешь структуру с изменённым полем - создавай новый инстанс структуры с изменённым полем, а старую менять нельзя.
Если очень нужно, то нужно использовать атомы, которые гарантируют отсутствие гонок в многопоточной программе.
В CL не так. Если создать структуру, то используя setf можно поменять значение поля in-place, как, скажем, в C или Java. Так же в CL есть массивы, которые меняются in-place и ведут себя как стандартные массивы из C (меняются через setf in-place).
А теперь посмотрим на Haskell, Erlang, OCaml - ЯП функциональная природа которых очевидна и заявлена создателями. Там никаких in-place преобразований не допускается, т.е. пересоздание структуры данных. В F# аналогично, для базовых структур данных (List, Set, Seq) и есть дополнительный синтаксис, если хочется поменять значение переменной (т.о. по дефолту классы написанные на F# тоже иммутабельны, а для мутабельности нужно явно это указать). Про Scala ничего не скажу - не знаю её.