10

在这里,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

4 回答 4

18

Perl 6 的语法只是用 Perl 6 编写的语法,并且非常具有可塑性(尽管当前的实现并不能完全提供所有指定的灵活性)。

所以你问的原则上是可能的,但可能需要更多的关注。特别是圆括号完全有效的 Perl 6 语法,甚至(defun a b)解析为有效的 Perl 6。所以你需要 /really / 小心消歧规则,这将是一个巨大的蠕虫罐。

lisp(...)将 Lisp 语法限制为某些特殊分隔的语法结构(如or )可能更有意义q:lisp{...},尽管可能可以实现一些混合。

我敢肯定,一旦这些功能在编译器中可用,我们将看到一大堆有趣的实验,只有这些实验才能表明哪种语言混合既可行又有用。

于 2011-11-08T20:43:24.417 回答
7

[我似乎错过了关于 Perl6 的问题,而不是 Perl5。无论如何留下我的答案,因为它可能会引起某些人的兴趣。]

据我了解,Scheme 和 Lisp 是相关的。如果你对 Scheme 没问题,Inline::MzScheme允许你在 Perl 中拥有 Scheme 代码块。

即使您对 Scheme 不满意,您也可以使用 fork 模块来编辑它以使用您最喜欢的 Lisp 引擎,而不会带来太多麻烦。

这与您描述的不太一样,但正如 moritz 解释的那样,您所描述的内容是不可能的,因为无法知道代码的哪些部分应该被视为 Perl 代码,哪些部分应该被视为 Lisp 代码。

另一方面,通过使用 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到您的代码中。)

于 2011-11-09T00:54:16.287 回答
5

Carl Masak 最近(2014 年末)创建了ipso,“Perl 6 中的元循环 Lisp”,适用于当前的 Rakudo。

将有一些方法可以与 P6 inline 结合使用;请探索“俚语”以了解更多信息,例如最近关于宏/俚语启用任意语言的递归内联的博客文章

另见 Damian Conway在 (P6ish) Lisp 中的快速排序

于 2014-11-29T20:17:20.420 回答
2

据我所知,Perl6 允许强大的、类似 Lisp 的宏。例如,解析器在该语言中可用。这允许您将任何语言实现为 Perl 的子语言,而不仅仅是解释器。

在 Ikegami 的示例中,他引入了关键字lisp(xxx),这将更加简单。lispxxx 可以是一个单独的宏,它解析 Lisp 并将其转换为 Perl6 并返回结果,在他的示例中,一个编译后的本地子程序接受一个参数。尽管我认为您实际上还需要实现您使用的 emacs Lisp 函数。实际上很容易做的是用 Lisp 语法来处理 Perl6 原语......例如。(+ a b c d) => {quasi + a b c d}这样您的 Lisp 语法就拥有 Perl6 的所有功能。

有关 perl6 和 AST 的简要介绍,请参阅http://strangelyconsistent.org/blog/macros-what-are-they-really

于 2012-07-31T12:27:54.290 回答