Есть ли языки программирования, где переменные действительно функции? - PullRequest
3 голосов
/ 07 октября 2009

Например, я бы написал:

x = 2
y = x + 4
print(y)
x = 5
print(y)

И это выведет:

6 (=2+4)
9 (=5+4)

Кроме того, есть ли случаи, когда это может быть полезно?

Разъяснение: да, лямбды и т. Д. Решают эту проблему (именно так я и пришел к этой идее); Мне было интересно, если бы были конкретные языки, где это по умолчанию : никакие функции или лямбда-ключевые слова не требуется или не требуется.

Ответы [ 10 ]

7 голосов
/ 07 октября 2009

Haskell встретит вас на полпути, потому что по сути все является функцией, но переменные связаны только один раз (то есть вы не можете переназначить x в той же области).

Легко считать y = x + 4 присваиванием переменной, но когда вы посмотрите на y = map (+4) [1..] (что означает добавление 4 к каждому числу в бесконечном списке от 1 и выше), что теперь будет y? Это бесконечный список или функция, которая возвращает бесконечный список? (Подсказка: это второй.) В этом случае обработка переменных как функций может быть чрезвычайно полезной, если не абсолютной необходимостью, при использовании лени .

Действительно, в Haskell ваше определение y - это функция, не принимающая аргументов и возвращающая x+4, где x также является функцией, которая не принимает аргументов, но возвращает значение 2.


На любом языке с функциями первого порядка назначение анонимных функций переменным тривиально, но для большинства языков необходимо добавить скобки для обозначения вызова функции.

Пример кода Lua:

x = function() return 2 end
y = function() return x() + 4 end
print(y())
x = function() return 5 end
print(y())
$ lua x.lua
6
9

Или то же самое в Python (придерживаясь функций первого порядка, но мы могли бы просто использовать простые числа для x):

x = lambda: 2

y = lambda: x() + 4

print(y())

x = lambda: 5

print(y())
$ python x.py
6
9
4 голосов
/ 07 октября 2009

Вы можете использовать выражения func в C #

Func<int, int> y = (x) => x + 5;
Console.WriteLine(y(5)); // 10
Console.WriteLine(y(3)); // 8

... или ...

int x = 0;
Func<int> y = () => x + 5;
x = 5;
Console.WriteLine(y()); // 10
x = 3;
Console.WriteLine(y()); // 8

... если вы действительно хотите программировать в функциональном стиле, первый вариант, вероятно, будет лучшим.

  1. это больше похоже на то, что вы видели на уроке математики.
  2. вам не нужно беспокоиться о внешнем состоянии.
2 голосов
/ 07 октября 2009

Проверьте различные функциональные языки, такие как F #, Haskell и Scala. Scala рассматривает функции как объекты, у которых есть метод apply (), и вы можете хранить их в переменных и передавать их, как и любые другие объекты. Я не знаю, что вы можете распечатать определение функции Scala в виде кода.

Обновление. Кажется, я вспоминаю, что, по крайней мере, некоторые Лиспы позволяют вам печатать функцию в виде кода (например, функцию симпатичной печати в Scheme).

1 голос
/ 27 октября 2009

Язык программирования Lucid делает это, хотя он вызывает x и y "потоки", а не функции. В программе будет написано:

y
  where
    y = x + 4
  end

И тогда вы введете:

 x(0): 2
   y = 6
 x(1): 5
   y = 7

Конечно, Lucid (как и большинство интересных языков программирования) довольно неясен, поэтому я не удивлен, что никто другой не нашел его. (или искал это)

1 голос
/ 07 октября 2009

Так работают электронные таблицы.

Это также связано с семантикой вызова по имени для оценки аргументов функции. Алгол 60 имел это, но он не завоевал популярность, слишком сложен для реализации.

0 голосов
/ 07 октября 2009

Я считаю, что математически ориентированные языки, такие как Октава , R и Maxima делают это. Я могу ошибаться, но никто больше не упомянул их, поэтому я подумал, что буду.

0 голосов
/ 07 октября 2009

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

def foo(x : => Int) {
    println(x)
    println(x) // x is evaluated again!
}

В некотором смысле, это может иметь эффект, который вы искали.

0 голосов
/ 07 октября 2009

Self не делает различий между полями и методами, оба являются слотами и доступны точно так же. Слот может содержать значение или функцию (так что эти два всё ещё являются отдельными объектами), но различие не имеет значения для пользователя слота.

0 голосов
/ 07 октября 2009

Самое близкое из них, что я видел, было частью систем технического анализа в компонентах построения диаграмм. (Tradestation, metastock и т. Д.), Но в основном они сосредоточены на возврате нескольких наборов метаданных (например, сигналов покупки / продажи), которые затем могут быть переданы в другие функции, которые принимают либо метаданные, либо финансовые данные, либо отображаются непосредственно.

Мой 2с: Я бы сказал, что язык, который вы предлагаете, будет очень запутанным, если не сказать больше. Функции, как правило, являются r-значениями по уважительной причине. Этот код (javascript) показывает, как применение функций в виде r-значений повышает удобочитаемость (и, следовательно, обслуживание) в n раз:

var x = 2;
var y = function() { return x+2; }
alert(y());
x= 5;
alert(y());
0 голосов
/ 07 октября 2009

Попробуйте проверить F # здесь и Википедия о функциональных языках программирования.

Я сам еще не работал над этими типами языков, так как сконцентрировался на ООП, но скоро буду углубляться, когда F # выйдет.

Надеюсь, это поможет!

...