Соответствующие операторы для семантики присваивания на нечистом декларативном языке.

StackOverflow https://stackoverflow.com/questions/1854465

  •  13-09-2019
  •  | 
  •  

Вопрос

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

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

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 здесь.

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

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

Это было полезно?

Решение

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

a = '(SignalA (SignalB))

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

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

Понятия не имею, будет ли это полезно;У меня нет такого опыта за пределами императивных языков, таких как Perl и C.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top