Инструкция Scheme let
в схеме, которая является функциональным языком программирования, нет оператора присваивания.
Но вlet
сообщении
(let ((x 2))
(+ x 3))
назначении 2
to x
, Так почему же это не нарушает принцип, что в функциональном программировании нет операторов присваивания?
2 ответов
утверждение "схема, которая является функциональным языком программирования" неверно. В Scheme стиль функционального программирования поощряется, но не принудительно. На самом деле, вы можете использовать set!
(оператор присваивания!) для изменения значения любой переменной:
(define x 10)
(set! x (+ x 3))
x
=> 13
о let
постановка вопроса, помните, что такое выражение, как это:
(let ((x 10))
(+ x 3))
=> 13
... это просто синтаксический сахар, и под капотом он реализован как это:
((lambda (x)
(+ x 3))
10)
=> 13
обратите внимание, что a let
выполняет разовые один поручениям по своим переменным, поэтому он не нарушает никакого чисто функционального принципа программирования per se, следующее Может быть подтверждено let
выражение:
оценка выражения не имеет побочного эффекта, если оно не изменяет наблюдаемое состояние машины и производит те же значения для того же ввода
также, цитата из Википедии:
нечистые функциональные языки обеспечивают как одно назначение, так и истинное назначение (хотя истинное назначение обычно используется с меньшей частотой, чем в императивных языках программирования). Например, в схеме оба одиночных назначения (с
let
) и истинное назначение (сset!
) может использоваться для всех переменных, а специализированные примитивы предоставляются для деструктивного обновления внутри списков, векторов, строк и т. д.
http://en.wikipedia.org/wiki/Assignment_(computer_science)#Single_assignment
в принципе, это одно назначение, которое допустимо. Другое назначение не "разрешено" из-за побочных эффектов.
Edit: разрешено в цитатах, потому что, как заявил Оскар, это не обязательно, но предлагается.