В каких языках программирования используются (использовались) шаблоны (про с++ знаю) и похожие на них сущности (малоли такие существуют, не плюсами едиными жив человек)
В Жабе generics но Жаба это такой C++ только лучше, в питоне они не нужны, в перле они не нужны, в руби они не нужны, в окамле не нужны.
Не нужны по той причине что в этих языках ты можешь передавать и хранить все что угодно, важно чтобы это все что угодно имело нужные имена (тип) случае последующего использования.
Если имеються в виду плюсовые templates, то в плюсах, джаве (хотя там и без них можно обойтись для обобщенного программинга), и по-моему в C# (хотя тут могу и ошибаться).
Если же имеються в виду шаблоны проектирования а-ля GOF Patterns - то почти к любому оо-языку их привязать можно.
> Жабе до плюсовых шаблонов как плюсовым шаблонам до defmacro
Обоснуй. И создай в плюсах виртуальную функцию-шаблон. А теперь создай в Жабе. А еще иногда бывает полезным заглянуть в .h файлы из STL'а и поужасаться. Неудивительно что мало какой parser в состоянии эту сложность правильно разобрать и предоставить редактору нормальной автокомплит.
PS Да это немного разные вещи, в плюсах это все происходит в момент компиляции, в Жабе "динамически" но это скорее аргумент скорости выполнения и только.
всем спасибо за информацию. и еще вопрос: я так понимаю, что в джаве есть так же как и в плюсах стандартная библиотека шаблонов (или как она там называется в джаве), если да - то есть ли различные её реализации (например как в плюсах: STL и QTL (http://doc.trolltech.com/3.3/qt-template-lib.html))
> всем спасибо за информацию. и еще вопрос: я так понимаю, что в джаве
> есть так же как и в плюсах стандартная библиотека шаблонов
Начиная с Жабы 1.5 все контейнеры (типа там LinkedList) принимают синтаксис в ключе
LinkedList<Integer> l = new LinkedList<Integer>();
То есть теперь не надо делать как раньше:
LinkedList l = new LinkedList();
l.pushBackOrSmth(new Integer(2));
((Integer)l.getBackOrSmth())
C этими бесконечными кастингами туда сюда.
Только там были какие-то проблемы с таблицами generic'ов но что и как уже хоть убей не помню.
Возможно, уже просто не помню. Там вроде бы есть type inherence. Но
сути дела это не меняет:
=== Cut ===
muf@cocaine:~/zzz$ cat test.ml
class wtfA =
object
method meth = 2
end;;
class wtfB =
object
method meth = 2
end;;
let f x = x#meth and a = new wtfB and b = new wtfB;;
let a = new wtfA;;
let b = new wtfB;;
print_int (f a);
print_int (f b);
flush stdout;
muf@cocaine:~/zzz$ ocamlc test.ml
muf@cocaine:~/zzz$ ./a.out
22
=== Cut ===
Хотя конечно ты прав в том ключе что там как-то иначе, то есть
в тех случаях когда в каком-нибудь питоне будет все в порядке
в окамле можно будет получать всякие expression has type Bool
but here is used with type Bool.
Тут f определилась как:
# val f : < meth : 'a; .. > -> 'a = <fun>
'a это насколько я помню "все что угодно", то есть да
тут иначе не по именам, type inherence + полиморфизм
объектов
PS Не знаю почему но мне этот язык просто физически
противен...
> let f x = x#meth and a = new wtfB and b = new wtfB;;
Тут конечно a = new wtfA, иначе пример не имеет смысла, но ничего не изменится, все продолжает работать.