2015-07-30 5 views
0

Я полагаю, что я не полностью понимаю концепцию ключевых слов в 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); 

сопрягает узор на ключевые слова (пока полностью) поддерживается, или я делаю что-то не так?

Спасибо!

+0

Если изменить строку:. 'Типы [я] = 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 в области возможностей. –

+0

. Вы можете изменить свой вопрос, чтобы добавлять детали, а не заполнять комментарий. – Blorgbeard

ответ

0

Прежде всего, да, сообщение об ошибке нуждается в улучшении. На самом деле есть еще одна несообщаемая ошибка, которая на первом месте. Все введенные переменные в шаблонах в заголовках функций в Rascal должны иметь типы. Интерпретатор не жалуется на это, и, следовательно, нисходящий поток имеет неожиданный результат.

Это исправляет проблему, аннотирования свежую переменную z с int:

Exp demoFun2(a(x, y = int z)) = b(z); 

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

rascal>if (a(x, y = q) := xxx) q; 
value: 3 

Тип q не должно быть ничего, кроме int дано объявление о y.

Спасибо за доклад, см https://github.com/cwi-swat/rascal/issues/843