Схема пусть заявление

В схеме, которая является функциональным языком программирования, оператор присваивания отсутствует. Но в операторе let

(let ((x 2))
    (+ x 3))

Вы присваиваете 2 x, так почему же это не нарушает принцип отсутствия операторов присваивания в функциональном программировании?


person omega    schedule 18.02.2013    source источник


Ответы (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

Обратите внимание, что let выполняет одноразовые одиночные присваивания своим переменным, поэтому не нарушает любого чисто функционального принципа программирования per se, о выражении let можно утверждать следующее:

Вычисление выражения не имеет побочного эффекта, если оно не изменяет наблюдаемое состояние машины и выдает те же значения для тех же входных данных.

Кроме того, цитата из Википедии:

Нечистые функциональные языки обеспечивают как одиночное присваивание, так и истинное присваивание (хотя истинное присваивание обычно используется реже, чем в императивных языках программирования). Например, в Scheme для всех переменных можно использовать как одиночное присваивание (с let), так и истинное присваивание (с set!), а для деструктивного обновления внутри списков, векторов, строк и т. д. предусмотрены специализированные примитивы.

person Óscar López    schedule 18.02.2013
comment
Функциональный язык программирования поощряет и предлагает функции для функционального программирования, но не обязательно навязывает его. - person ThePiercingPrince; 25.02.2014
comment
То, что схема не навязывает стили функционального программирования, не означает, что так ее называть некорректно. Он предлагает возможность использовать императивные операции, такие как set (изменить среду, чтобы повлиять на состояние), но он не предлагает полный набор функций, таких как циклы и т. д., поэтому Scheme — это язык функционального программирования, который предлагает некоторые императивные функции. - person NeoH4x0r; 09.04.2020
comment
@NeoH4x0r на самом деле Схема действительно предлагает традиционные циклы (см. цикл do) и, в зависимости от диалекта, довольно широкий спектр конструкций циклов for. Я бы сказал, что это довольно полный набор императивных функций :). Назовите мне одну функцию, которой, по вашему мнению, не хватает, и, держу пари, я найду ее для вас! - person Óscar López; 09.04.2020
comment
@ Óscar López Это по-прежнему не делает неправильным вызов функционального языка (даже если он предлагает некоторые императивные функции). - person NeoH4x0r; 09.04.2020