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