Я пытаюсь лучше понять, что на самом деле означает «динамический» язык. У меня довольно большой опыт работы с Lingo, языком сценариев для линейки продуктов Adobe (ранее Macromedia) Director, и мне просто интересно, будет ли он считаться «динамическим языком».
Способ обработки переменных и списков кажется мне очень "динамичным языком".
С переменными вы должны просто написать foo = 3
или bar = "Hello World"
. Вы не объявляете переменную как int
или _4 _ - она вычисляет это как есть.
Со списками вы можете просто написать что-то вроде miscCollection = [3, "Hello World", #helloWorld, ["Embedded List", "Goes Here", 3], [#phrase: "Property List goes here", #value: 3]]
. Разве это не было бы похоже на tuple
?
Достаточно ли этих функций, чтобы претендовать на статус «динамического языка»?
Интересно, что я гораздо больше использую C #, а Director / Lingo - намного меньше, но, несмотря на все волнения по поводу динамических языков в наши дни, мне интересно, действительно ли я иду против течения.
ИЗМЕНИТЬ
Что касается ответа Марка Рушакоффа, то ниже сделана попытка проанализировать, квалифицируется ли Lingo как «динамический», используя эту статью в Википедии < / а>:
Eval
- В Lingo есть ключевые словаdo
иvalue
.do
выполнит всю команду, например,do "foo = 23"
илиdo "foo = sum(20, 3)"
.value
пытается преобразовать строку в число, но это больше, чем просто оператор синтаксического анализа - он может фактически преобразовать строковое представление переменной в ее номер, например, предполагаяfoo = 23
, операторvalue("foo")
будет оценивать как 23.Функции высшего порядка - если я правильно понимаю, это, по сути, то, что я бы назвал «делегатом» в C #. Насколько мне известно, Lingo не поддерживает это напрямую, хотя вы можете создать тип (называемый «родительским скриптом»), который имеет функцию и передать экземпляр типа.
Замыкания - Насколько я знаю, это не поддерживается.
Продолжение - Насколько я знаю, это не поддерживается.
Отражение - По крайней мере, да. Фактически вы создаете новые экземпляры типов, используя строку, например
fooInstance = script("Foo").new(bar)
. Также возможно преобразовать экземпляр типа в строку, содержащую имя типа (чтобы вы могли имитироватьGetType()
функциональность C #). Вы также можете запрашивать свойства типа, не зная имен свойств (например, искать свойство по индексу) и узнавать имена свойств по индексу.Макросы. Я не верю в то, как статья в Википедии описывает макрос. Однако можно редактировать сценарии во время выполнения, так что, возможно, это имеет значение.
Итак, кажется, что Lingo получает от 2 до 3 баллов из 6 по динамическим функциям, но я недостаточно разбираюсь в закрытии и продолжении, чтобы точно знать, что Lingo их не поддерживает. Думаю, я не уверен, что делать выводы. Комментарии приветствуются.
eval
- единственное значимое определение. Конечно, есть также динамически типизированные, и я не уверен, должна ли ваша динамика быть той же самой или совершенно другой концепцией. - person Pavel Minaev   schedule 02.11.2009