Обновление 2: примеры удалены, поскольку они вводили в заблуждение. Те, что ниже, более актуальны.
Мой вопрос:
Есть ли язык программирования с такой конструкцией?
Обновление:
Теперь, когда я думаю об этом, у Пролога есть нечто подобное.
Я даже позволяю определять операции в строке определения.
(забудьте о возврате и отношениях - подумайте о синтаксисе)
Я задал этот вопрос, потому что считаю, что хорошо иметь симметрию в языке.
Симметрия между параметрами "in" и параметрами "out".
Если возвращать подобные значения было бы легко, мы могли бы отбросить явное возвращение на разработанном языке.
перебирая пары ... Я думаю, что это взлом. нам не нужна структура данных для передачи нескольких параметров в функцию.
Обновление 2:
Чтобы привести пример синтаксиса, который я ищу:
f (s, d&) = // & indicates 'out' variable
d = s+s.
main =
f("say twice", &twice) // & indicates 'out' variable declaration
print(twice)
main2 =
print (f("say twice", _))
Или в стиле функционал + пролог
f $s (s+s). // use $ to mark that s will get it's value in other part of the code
main =
f "say twice" $twice // on call site the second parameter will get it's value from
print twice
main2 =
print (f "Say twice" $_) // anonymous variable
В предлагаемом языке нет выражений, потому что все возвраты осуществляются через параметры. Это было бы обременительно в ситуациях, когда глубокие иерархические вызовы функций естественны. Пример с Лиспом:
(let x (* (+ 1 2) (+ 3 4))) // equivalent to C x = ((1 + 2) * (3 + 4))
потребуются имена языков для всех временных переменных:
+ 1 2 res1
+ 3 4 res2
* res1 res2 x
Поэтому я предлагаю анонимные переменные, которые превращают весь вызов функции в значение этой переменной:
* (+ 1 2 _) (+ 3 4 _)
Это не очень естественно, потому что весь культурный багаж у нас есть, но я хочу выбросить все предубеждения о синтаксисе, которые у нас есть в настоящее время.