Я могу записать DSL в Perl?

Решение заключается в проверке AndroidX при запуске нового проекта в Android Studio, затем в файле App Module Build.Gradle отлично работает следующее:

def room_version = "2.1.0-alpha03"
implementation "androidx.room:room-runtime:$room_version"
kapt "androidx.room:room-compiler:$room_version" // use kapt for Kotlin
13
задан Peter Mortensen 26 January 2010 в 20:21
поделиться

4 ответа

Можно сделать почти что-либо в Perl. Но необходимо сделать некоторый странный материал, чтобы заставить Perl работать с синтаксисом, который является просто не Perl.

  • Для обработки точно, что Вы имеете там Вы имели бы к большому количеству усовершенствованных приемов, которые по определению не настолько удобны в сопровождении. Вы имели бы к:

    • перегрузитесь оператор '.' конкатенации (требует счастливой ссылки),
    • выключите резкую критику или создайте АВТОЗАГРУЗКУ нижние индексы для обеспечения тех пустых слов - конечно, Вы могли записать нижние индексы для всех слов, Вы хотели использовать (или использовать barewords модуль).
    • возможно, создайте несколько пакетов с несколькими AUTOLOADs
  • Иначе фильтры источника, я могу, вероятно, взять downvote только для упоминания этой возможности. Таким образом, я точно не рекомендовал бы этот подход для людей, которые обращаются за помощью. Но это там. Фильтры источника (и я сделал свою долю), только одна из тех областей, где можно думать, что Вы слишком умны для своей собственной пользы.

    Однако, если Вы интересуетесь Perl как язык "хоста" DSL, затем фильтры источника не точно от пределов. Однако ограничение этого к, что Вы показываете, что хотите сделать, Perl6:: Атрибуты, вероятно, сделают большую часть того, что Вам была бы нужна сразу же полка. Это взяло бы . и переведите их в "->", который понял бы Perl. Но можно все еще смотреть на фильтры источника для понимания то, что продолжается негласно.

    Я также не хочу оставлять эту тему, не предполагая, что много разочарования, у Вас могла быть генерация Вашего собственного фильтра источника (которому я советую, чтобы НЕ сделать) упрощено при помощи Фильтра Damian Conway:: Простой.

  • Самая простая вещь состоит в том, чтобы воздержаться от '.' оператора и просто вместо этого ожидать выглядящий словно Perl код.

    App->View2->Page2->Activate(); 
    App->View1->Page2->Click();
    

    App был бы или пакет или замена. Или определенный в текущем пакете или импортированный, какие возвраты объект благословлены в пакет с a View2 sub (возможно AUTOLOAD sub), который возвращает или название пакета или ссылку, бывшую благословленную в пакет, который понимает Page2, и затем наконец возврат из этого понял бы Activate или Click. (См. учебное руководство OO, если Вам нужно.)

20
ответ дан 1 December 2019 в 19:32
поделиться

Я рекомендую выйти из попытки сделать причудливый материал "DSL" и просто записать классы Perl для обработки объектов, которыми Вы хотите управлять. Я рекомендую изучить использование новой системы объекта Perl Американского лося для этого, хотя традиционный Perl OO был бы очень хорошо. Выройте через документацию Perl для учебных руководств OO; они являются великими.

6
ответ дан 1 December 2019 в 19:32
поделиться

Вызовы метода в использовании perl5 -> нет ., таким образом, это будет похоже App->View2->Page2->Activate() или $App->View2->Page2->Active() если Вы не делаете что-то действительно интересное (например, фильтр источника). Принятие этого в порядке, можно использовать нормальный Perl материал OO.

Теперь, следующая часть того, в чем Вы нуждаетесь, должна создать методы во времени выполнения. Это на самом деле довольно просто:

sub _new_view {
    my ($view, $view_num);

    # ...
    # ... (code to create $view object)
    # ...

    my $sym = "App::View$view_num";
    *$sym = sub { return $view }; # can also use Symbol package
}

С другой стороны, если Вы хотите создать методы только, когда их называют, это что AUTOLOAD делает. Можно также злоупотребить автозагрузкой, чтобы заставить все вызовы метода успешно выполниться (хотя не упускают с особыми значениями, как УНИЧТОЖАЮТ).

Это получит Вас синтаксис. Наличие Ваших объектов генерирует строку для передачи send_command не должно быть настолько трудным.

Кроме того, я не слишком знаком с ним, но можно хотеть проверить Американского лося. Это может иметь более легкие способы выполнить это.

4
ответ дан 1 December 2019 в 19:32
поделиться

Фильтр источника DSL

Вот другая попытка. skiphoppy имеет точку, но на втором взгляде, я заметил, что (до сих пор) Вы не спрашивали много, которое было тем комплексом. Вы просто хотите принять каждое управление и сказать удаленному серверу делать это. Это не жемчуг, который должен понять команды, это - сервер.

Так, я удаляю некоторые свои предупреждения о фильтрах источника, и решенный, чтобы показать Вам, как простой может быть записан. Снова, то, что Вы делаете, не то, что комплекс и моя "фильтрация" ниже довольно легки.

package RemoteAppScript;
use Filter::Simple;    # The basis of many a sane source filter
use Smart::Comments;   # treat yourself and install this if you don't have 
                       # it... or just comment it out.

# Simple test sub
sub send_command { 
    my $cmd = shift;
    print qq(Command "$cmd" sent.\n);
    return;
}

# The list of commands
my @script_list;

# The interface to Filter::Simple's method of source filters.
FILTER { 
    # Save $_, because Filter::Simple doesn't like you reading more than once.
    my $mod = $_;

    # v-- Here a Smart::Comment.
    ### $mod

    # Allow for whole-line perl style comments in the script
    $mod =~ s/^\s*#.*$//m;

    # 1. Break the package up into commands by split
    # 2. Trim the strings, if needed
    # 3. lose the entries that are just blank strings.
    @script_list 
        = grep { length } 
          map  { s/^\s+|\s+$//g; $_ } 
          split /;/, $mod
        ;
    ### @script_list

    # Replace the whole script with a command to run the steps.
    $_ = __PACKAGE__ . '::run_script();';
    # PBP.
    return;
};

# Here is the sub that performs each action.
sub run_script { 
    ### @script_list
    foreach my $command ( @script_list ) {
        #send_command( $command );
        socket_object->send_command( $command );
    }
}

1;

Необходимо было бы сохранить это в RemoteAppScript.pm где-нибудь, где Ваш жемчуг может найти его. (попробуйте perl -MData::Dumper -e 'print Dumper( \@INC ), "\n"' если необходимо знать где.)

Затем можно создать "perl" файл, который имеет это:

use RemoteAppScript;
App.View2.Page2.Activate();
App.View1.Page2.Click();

Однако

Там никакая настоящая причина, что Вы не можете считать файл, который содержит команды сервера. Это вывело бы FILTER звонить. Вы имели бы

App.View2.Page2.Activate();
App.View1.Page2.Click();

в Вашем файле сценария и Вашем файле жемчуга больше походил бы на это:

#!/bin/perl -w 

my $script = do { 
    local $/;
    <ARGV>;
};

$script =~ s/^\s*#.*$//m;

foreach my $command ( 
    grep { length() } map  { s/^\s+|\s+$//g; $_ } split /;/, $script 
) { 
    socket_object->send_command( $command );
}

И назовите его как так:

perl run_remote_script.pl remote_app_script.ras
4
ответ дан 1 December 2019 в 19:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: