Инструкция 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: разрешено в цитатах, потому что, как заявил Оскар, это не обязательно, но предлагается.