Я полагаю, что я не полностью понимаю концепцию ключевых слов в Rascal по отношению к сопоставлению с образцом (так как следующие обозначения фактически поддерживаются Rascal). Скажем, я определил тип данных Exp
и функцию demoFun1
(при условии, что в этом случае z
связывается с y
):Предполагаемые типы параметров ключевого слова конструктора в шаблоне Rascal соответствуют
data Exp = a(int x, int y = 5) | b(int x);
Exp demoFun1(a(x, y = z)) = b(z);
И тогда я исполню: demoFun1(a(2, y = 3))
, Rascal возвращает:
|stdin:///|(25,4,<1,25>,<1,29>): The called signature: b(value),
does not match the declared signature: Exp = b(int)
(Который уже довольно странное сообщение об ошибке, так как я не могу сказать что-то вроде int y = ...
в аргументах, предполагая, что это будет правильный синтаксис). Однако, если я определяю другую функцию, вместо этого я предполагаю, что значение после знака «=» является значением по умолчанию (как в случае ADT-определения), и я могу просто использовать значение y
вместо:
Exp demoFun2(a(x, y = 3)) = b(y);
И я исполню demoFun2(a(1, y=2))
Затем Rascal возвращается:
|stdin:///|(0,19,<1,0>,<1,19>): The called signature: demoFun2(Exp),
does not match the declared signature: Exp demoFun2(Exp); (abstract pattern);
сопрягает узор на ключевые слова (пока полностью) поддерживается, или я делаю что-то не так?
Спасибо!
Если изменить строку:. 'Типы [я] = resultElem.getType()' 'для типов [я] = resultElem.getValue() GetType(); 'in' Expression.interpret' (и изменение 'if (! val.getType(). isSubtypeOf (kwFormals.getFieldType (name))) {' to 'if (! val.getValue(). getType(). isSubtypeOf (kwFormals .getFieldType (name))) {'в той же функции по той же основной причине), первый пример действительно работает. Однако это НЕ исправление: теперь переменные привязаны к их типам reified, что является изменением семантики. Кажется, что есть проблема с привязкой аргументов ключевого слова к среде Rascal в области возможностей. –
. Вы можете изменить свой вопрос, чтобы добавлять детали, а не заполнять комментарий. – Blorgbeard