Соответствующие операторы для семантики присваивания в не чистом декларативном языке - PullRequest
0 голосов
/ 06 декабря 2009

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

С одной стороны, переменная должна представлять вывод определенной группы операторов сигналов. Этот выход затем может быть присоединен к другому входу. Это важно для направления разных выходов в разные места, например:

a, b, c = (SignalA with three outputs)
(SignalB a)
(SignalC c)
(SignalD a)

В этом случае будет SignalA с тремя выходами, где первый и третий выходы связаны с SignalB и SignalC соответственно, а SignalD также связан с первым выходом SignalA. Существует только один экземпляр SignalA.

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

a = (SignalA (SignalB))
(SignalC a)
(SignalD a)

В этом случае я бы хотел, чтобы a представлял композицию SignalA и SignalB, и это воспроизводит в качестве входных данных для SignalC и SignalD. Здесь есть два экземпляра SignalA.

Итак, мой вопрос в функциональном / декларативном программировании, есть ли общие термины для этих двух семантик присваивания? И на моем языке, какой из них должен получить '=', и что будет общим оператором для другого? (возможно: =?)

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

1 Ответ

0 голосов
/ 06 декабря 2009

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

a = '(SignalA (SignalB))

Если ваше использование на самом деле не похоже на лямбду, то это, вероятно, вызовет еще большую путаницу.

Кстати, в первом случае вы могли бы следовать идее Perl для левой части списка назначений: (a, b, c) = (SignalA with three outputs)

Не знаю, будет ли это полезно; Я не настолько опытен вне императивных языков, как perl и C.

...