Взгляните на этот e4x пример в JavaScript:
var sales = <sales vendor="John">
<item type="peas" price="4" quantity="6"/>
<item type="carrot" price="3" quantity="10"/>
<item type="chips" price="5" quantity="3"/>
</sales>;
alert( sales.item.(@type == "carrot").@quantity );
alert( sales.@vendor );
for each( var price in sales..@price ) {
alert( price );
}
Особенно, посмотрите на строку:
alert( sales.item.(@type == "carrot").@quantity );
На типичных статических языках вам не нужно писать sales.item, так как вы не можете знать, что товар является собственностью продаж до времени выполнения.
Это не ограничено е4х. При подключении вы пишете в аналогичном стиле при написании SOAP-клиентов или любого другого базового типа, о котором вы не знали до времени выполнения.
На статическом языке обычно требуется запустить инструмент, который будет генерировать заглушки или программы очень подробным образом. Затем, если что-то изменится в веб-сервисе, вам нужно будет заново генерировать заглушки. Посмотрите на код DOM Java:
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
public class Foo {
public Document createDocument() {
Document document = DocumentHelper.createDocument();
Element root = document.addElement( "root" );
Element author1 = root.addElement( "author" )
.addAttribute( "name", "James" )
.addAttribute( "location", "UK" )
.addText( "James Strachan" );
Element author2 = root.addElement( "author" )
.addAttribute( "name", "Bob" )
.addAttribute( "location", "US" )
.addText( "Bob McWhirter" );
return document;
}
}
Определенно гораздо более многословный, чем ваш динамический код. И, конечно же, он не является статически типизированным. Невозможно проверить, правильно ли вы указали слово «автор» как «автор» до времени выполнения. Все это многословие, по сути, позволяет вам захватывать что-то динамическое в природе в статическом стиле.
Я думаю, что это одна из сильных сторон динамических языков.