Возможно ли реализовать язык lisp в Perl 6? - PullRequest
9 голосов
/ 09 ноября 2011

Здесь, интерпретация Hello $world для каждого символа цитирования, я имею в виду язык .

 $world = "WΩrlδ"
"(Hell)*o $world\n"           # <--- plain (Hell)*o, resolve $world, escape \n
'(Hell)*o $world\n'           # <--- plain (Hell)*o, plain $world, escape \n
/(Hell)*o $world\n/           # <--- regexp (Hell)*, resolve $world, interpret \n
<(Hell)*o $world\n>           # <--- make list ["(Hello*o", "$world\n"]
{(Hell)*o $world\n}           # <--- syntax error, this language cant' parse it

Так что Perl 6 достаточно мощен, чтобы существовать в будущем языке для чего-то вроде

my $emacs_func = (defun perl-backward-to-start-of-continued-exp (lim)
      (if (= (preceding-char) ?\))
          (forward-sexp -1))
      (beginning-of-line)
      (if (<= (point) lim)
          (goto-char (1+ lim)))
      (skip-chars-forward " \t\f"))


$  typeof($emacs_func)
> Emacs Lisp list

Итак, вопрос, очевидно, таков: can it be done in present specification (or even implementation) of Perl 6?

Ответы [ 4 ]

17 голосов
/ 09 ноября 2011

Грамматика Perl 6 - это просто грамматика, написанная на Perl 6, и очень гибкая (хотя современные реализации не совсем обеспечивают всю предполагаемую гибкость).

Итак, то, что вы просите, в принципе возможно, но может потребовать больше внимания. В частности, круглые скобки являются совершенно допустимым синтаксисом Perl 6, и даже (defun a b) анализирует как действительный Perl 6. Так что вам нужно быть / действительно / осторожным с правилами устранения неоднозначности, и это будет огромная банка червей.

Возможно, имеет смысл ограничить синтаксис Lisp какой-либо специально разграниченной синтаксической конструкцией (например, lisp(...) или q:lisp{...}), хотя некоторое количество микширования, вероятно, будет осуществимо.

Я уверен, что как только такие функции станут доступны в компиляторе, мы увидим множество интересных экспериментов, и только эти эксперименты покажут, какой тип смешивания языков возможен и полезен.

7 голосов
/ 09 ноября 2011

[Кажется, я пропустил вопрос о Perl6, а не о Perl5.В любом случае, оставив мой ответ, поскольку он может быть интересен для некоторых.]

Насколько я понимаю, Схема и Лисп связаны между собой.Если вместо этого вы в порядке со Scheme, Inline :: MzScheme позволяет иметь блоки кода Scheme в Perl.

Даже если вы не в порядке со Scheme, вы наверняка можете разветвлятьсямодуль для редактирования, чтобы использовать ваш любимый движок Lisp без особых проблем.

Это не совсем то, что вы описали, но, как объяснил Мориц, то, что вы описали, невозможно, потому что нет способа узнать, какие части кодадолжен рассматриваться как код Perl, а какие части должны рассматриваться как код Лисп.

С другой стороны, с помощью подключаемого обработчика токенов 5.14 (используется feature :: qw_comments например, для переопределения qw, относительно легко сделать следующее:

my $emacs_func = lisp(defun perl-backward-to-start-of-continued-exp (lim)
   (if (= (preceding-char) ?\))
      (forward-sexp -1))
   (beginning-of-line)
   (if (<= (point) lim)
      (goto-char (1+ lim)))
   (skip-chars-forward " \t\f"));

(обратите внимание на добавление lisp к вашему коду.)

4 голосов
/ 29 ноября 2014

Карл Масак (Carl Masak) недавно (в конце 2014 г.) создал ipso, "Метациклический Лисп в Perl 6" , который работает на текущем Rakudo.

Будут способы, которыми его можно комбинировать с P6 inline;пожалуйста, изучите "сленги", чтобы узнать больше об этом, например, недавнее сообщение в блоге о макросах / сленгах, позволяющих рекурсивное встраивание произвольных языков .

См. также Быстрая сортировка Дамиана Конвея в (P6ish)Лисп

2 голосов
/ 31 июля 2012

Насколько я вижу, Perl6 допускает мощные, похожие на Lisp макросы. Например. парсер доступен на языке. Это позволяет вам реализовать ЛЮБОЙ язык как подъязык Perl, а не только как интерпретатор.

В примере Икегами он ввел ключевое слово lisp(xxx), и это было бы еще проще. Lispxxx может быть одним единственным макросом, который анализирует и переводит Lisp в Perl6 и возвращает результат, а в его примере - скомпилированный нативный саб, принимающий один аргумент. Хотя я считаю, что на самом деле вам нужно реализовать функции Lisp emacs, которые вы также используете. На самом деле, что было бы легко сделать, это обратиться к примитивам Perl6 с синтаксисом Lisp ... например. (+ a b c d) => {quasi + a b c d} чтобы ваш синтаксис Lisp имел всю мощь Perl6.

См. http://strangelyconsistent.org/blog/macros-what-are-they-really для легкого введения в perl6 и AST.

...