Утверждение «Схема, которая является функциональным языком программирования» неверно. В Scheme поощряется, но не навязывается стиль функционального программирования. Фактически, вы можете использовать set!
(оператор присваивания!) для изменения значения любой переменной:
(define x 10)
(set! x (+ x 3))
x
=> 13
Что касается let
утверждения вопроса, помните, что такое выражение, как это:
(let ((x 10))
(+ x 3))
=> 13
... это просто синтаксический сахар, а под капотом он реализован так:
((lambda (x)
(+ x 3))
10)
=> 13
Обратите внимание, что let
выполняет одноразовые одиночные присваивания своим переменным, поэтому не нарушает любого чисто функционального принципа программирования per se, о выражении let
можно утверждать следующее:
Вычисление выражения не имеет побочного эффекта, если оно не изменяет наблюдаемое состояние машины и выдает те же значения для тех же входных данных.
Кроме того, цитата из Википедии:
Нечистые функциональные языки обеспечивают как одиночное присваивание, так и истинное присваивание (хотя истинное присваивание обычно используется реже, чем в императивных языках программирования). Например, в Scheme для всех переменных можно использовать как одиночное присваивание (с let
), так и истинное присваивание (с set!
), а для деструктивного обновления внутри списков, векторов, строк и т. д. предусмотрены специализированные примитивы.
person
Óscar López
schedule
18.02.2013