是否可以在Perl 6中实现lisp“语言”?

时间:2011-11-08 20:03:26

标签: perl parsing lisp perl6

在这里,每个引用符号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 个答案:

答案 0 :(得分:15)

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

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

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

我敢肯定,一旦这些功能在编译器中可用,我们就会看到很多有趣的实验,只有那些实验才会显示哪种语言混合既可行又有用。

答案 1 :(得分:7)

[我似乎错过了关于Perl6的问题,而不是Perl5。无论如何都要留下我的答案,因为有些人可能对此感兴趣。]

我的理解是Scheme和Lisp是相关的。如果您对Scheme没有问题,那么Inline::MzScheme允许在Perl中包含Scheme代码块。

即使你不熟悉Scheme,你也可以分叉模块来编辑它以使用你最喜欢的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。)

答案 2 :(得分:3)

Carl Masak最近(2014年末)创建了ipso, "A metacircular Lisp in Perl 6",适用于当前的Rakudo。

它可以与P6内联组合;请详细了解“俚语”,例如a recent blog post about macros/slangs enabling recursive inlining of arbitrary langs

答案 3 :(得分: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