2013-09-25 2 views
1

Согласно этой странице:Не разрешено использовать минусы в списке; «Не соответствует ни одному из объявленных (перегруженных) образцов подписи»

http://tutor.rascal-mpl.org/Rascalopedia/List/List.html

Это, как вы используете недостатки в списках:

cons(1,[2,3]); //should return [1,2,3] 

Пытается это в Мошенник консоль:

import List; 
cons(1,[2,3]); 

дает мне эту ошибку:

|stdin:///|(1,13,<1,1>,<1,14>): The called signature: cons(int, list[int]), 
does not match any of the declared (overloaded) signature patterns: 
    Symbol = cons(Symbol,str,list[Symbol]) 
    Production = cons(Symbol,list[Symbol],set[Attr]) 
    Symbol = cons(Symbol,str,list[Symbol]) 
    Production = cons(Symbol,list[Symbol],set[Attr]) 

Есть ли какое-то столкновение имен со стандартными импортированными функциями и типами данных?

+0

ли мы ответить на ваш вопрос Гильденстерн? – jurgenv

ответ

1

Хороший вопрос. Сначала простой ответ. Минусы не существуют как библиотечная функция для построения списков (это скорее часть API типов reified, означающая нечто иное).

Мы пишем это:

rascal>[1, *[2,3,4]] 
list[int]: [1,2,3,4] 

rascal>1 + [2,3,4] 
list[int]: [1,2,3,4] 

rascal>[1] + [2,3,4] 
list[int]: [1,2,3,4] 

rascal>list[int] myList(int i) = [0..i]; 
list[int] (int): list[int] myList(int); 

rascal>[*myList(10), *myList(20)] 
list[int]: [0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19] 

Теперь объяснение путаницы. Курс Rascalopedia основан на абстрактных понятиях и терминах, которые обычно хорошо знают при работе с Rascal. Это может быть слишком простым для вас. Я хотел бы сосредоточиться на курсе языка языковых и библиотек для более конкретных примеров и информации, относящихся к программированию в Rascal. См. http://tutor.rascal-mpl.org/Rascal/Expressions/Values/List/List.html для списка литералов и http://tutor.rascal-mpl.org/Rascal/Libraries/Prelude/List/List.html для функций библиотеки в списках.

Некоторые другие список поворотливость, используется для деконструкции, в отличие от построения:

rascal>[1,2,3,4][1..] 
list[int]: [2,3,4] 

rascal>[1,2,3,4][1..2] 
list[int]: [2] 

rascal>[1,2,3,4][..-1] 
list[int]: [1,2,3] 

rascal>if ([*x, *y] := [1,2,3,4], size(x) == size(y)) println(<x,y>); 
<[1,2],[3,4]> 
ok 

rascal>for ([*x, *y] := [1,2,3,4]) println(<x,y>); 
<[],[1,2,3,4]> 
<[1],[2,3,4]> 
<[1,2],[3,4]> 
<[1,2,3],[4]> 
<[1,2,3,4],[]> 
+0

Какова мотивация перегрузки '+' для обозначения как построения, так и конкатенации. На мой взгляд, это не только противоречит понятию статической типизации языка ('1 + [2]' должно вызывать ошибку типа!), Но также устанавливает яму для пользователей, чтобы они упали, как указано [здесь] (http:// /tutor.rascal-mpl.org/Rascal/Rascal.html#/Rascal/Expressions/Values/List/Insert/Insert.html) – day

+0

Мотивация заключалась в том, что мы думали, что у нас уже слишком много операторов, и Rascal начинал чувствовать Perl, но мы вернулись из этого в последнее время. Следующая версия Rascal будет иметь '<<' and '>>' операторы для добавления элементов к наборам, спискам (или что-то подобное, а не двусмысленным с остальной частью языка). Хорошая вещь о «альфа-языке», мы все равно можем ее изменить. Спасибо за ответ! – jurgenv

+0

О, тогда вы, ребята, вероятно, должны поместить альфа-тег на домашнюю страницу Rascal, чтобы пользователи знали, что язык может подвергаться будущим несовместимым изменениям! Честно говоря, я только узнал этот факт сейчас, после того, как я написал переводчика Lisp у Rascal. Хотя он не предназначен для выпуска как отдельное приложение (я сомневаюсь, что это возможно до тех пор, пока компилятор Rascal не будет готов.), Это раздражает, чтобы увидеть мой разрыв кода позже. Я думаю, что важно, чтобы вы суммировали эти изменения всякий раз, когда выпускается новая версия Rascal. – day