Меня всегда интересовал вопрос: «В чём основная сложность разработки плагинов для IDE для динамических языков?». Посмотрев код плагина поддержки Perl для Eclipse и почитав форумы, я обнаружил что порой программа может быть правильно разобрана на лексемы только самим интерпретатором, например в случае, когда порядок разбора зависит от уже произведённых действий при разборе. Наглядный пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#!/usr/bin/perl BEGIN { if(0.5 < rand(1)){ require Mod1; Mod1->import( 'one' ); } else{ require Mod2; Mod2->import( 'one' ); } } $_ = ''; print one / 25 ; # / ; die "this dies!"; |
В котором последняя строка может содержать как регэксп так и деление в зависимости от прототипа загруженной функции.
1 2 3 4 5 6 7 8 9 10 11 |
package Mod1; our $VERSION = '1.00'; use base 'Exporter'; our @EXPORT = qw(one); sub one(){ return 123; } 1; |
1 2 3 4 5 6 7 8 9 10 11 |
package Mod2; our $VERSION = '1.00'; use base 'Exporter'; our @EXPORT = qw(one); sub one($){ return 123; } 1; |
И результат выполнения:
1 2 3 4 5 |
$ ./hello.pl 4.92 $ ./hello.pl this dies! at ./hello.pl line 14. 123 |