ulidtko
24.02.2012 21:20 уважением
Всю неделю вынашивал концепцию языка, совмещающего статическую и динамическую типизацию. Эксплуатирующего преимущества обоих парадигм, и защищённого от их недостатков.
И вот, сегодня мне рассказали про тип dynamic в C#.
http://msdn.microsoft.com/en-us/library/...
Похоже, пришло время взглянуть на mono поближе.
в статическом языке эмулировать динамику так сложно — просто охуеть.
да, тип TVariant в старом добром делфи меня сильно вдохновлял на эти размышления.
Но ты не путай эмуляцию через всякие костыли вроде QVariant с нативной поддержкой в языке. Прозрачной. С точно таким же синтаксисом вызова метода через точку, например. Да и вообще, с методами как таковыми — вместо указателей на функции. Это качественное отличие, я считаю.
>костыли вроде QVariant с нативной поддержкой в языке
я не путаю, ибо в душе не ебу ни того ни другого.
просто мне совершенно очевидно как реализовать язык с динамической типизацией, и наверняка те два варианта именно так и выглядят.
C#'s principal designer and lead architect at Microsoft is Anders Hejlsberg, who was previously involved with the design of Turbo Pascal, Embarcadero Delphi (formerly CodeGear Delphi and Borland Delphi), and Visual J++.
ололололо.
да, динамика иногда бывает полезна в статически-типизированных языках. Настолько, что мне пришлось реализовывать её для окамла. А вариантов особо не видел, разве что обмазываться кодогенерацией.
Среди целей было не столько "прозрачно вызывать методы", сколько 1. возможность присовывать в значения те методы, типы которых компилятор не знает на момент линковки библиотеки (что в простом случае нереально), 2. рантайм-интроспекция значений. Заодно почти нахаляву получил и различные [де]сериализации, работающие по структуре значения, способ заглянуть в значение, вытащить оттуда что-то, параметризованные типы (например, если известно, как отображать список значений в целом (например, "заключить в квадратные скобки и разделить элементы через " ; ""), и известно, как отображать конкретное значение, то можно отобразить список, содержащий эти значения, простым вызовом метода типа show).
Ну а дальше — пошло-поехало, вплоть до разбора урлов в индуктивный тип данных.
А вызов метода, да, непрозрачен. Как-то наподобие "(call_method2 "meth" type_obj type_arg1 type_arg2 type_res) obj arg1 arg2" вместо "obj#meth arg1 arg2", но при однотипности методов этот код пишется один раз, а используется везде при работе с методом. Можно было бы побороть синтаксис, сделав синтаксическое расширение, но пока я без них обхожусь, и всё реализовано средствами обычной библиотеки, в этом есть какая-то прелесть.
facepalm
очень быстро
аргументы?
спасибо, годнота