10

ここで、Hello $world各引用符ごとの解釈はlanguageを意味します。

 $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 として解析することさえできます。そのため、あいまいさを解消するルールに/本当に/注意する必要があり、ワームの巨大な缶になります。

lisp(...)Lisp 構文を特別に区切られた構文構造 (または など)に制限することはおそらくより理にかなっていますがq:lisp{...}、ある程度の混合はおそらく実装可能です。

そのような機能がコンパイラで利用可能になると、興味深い実験がたくさん見られると確信しています.それらの実験だけが、どのような種類の言語混合が実現可能で有用であるかを示します.

于 2011-11-08T20:43:24.417 に答える
7

[私は、Perl5ではなくPerl6についての質問を見逃したようです。一部の人にとっては興味深いかもしれないので、とにかく私の答えを残しておきます。]

私の理解では、SchemeとLispは関連しています。代わりにSchemeに問題がない場合は、Inline :: MzSchemeを使用すると、Perlで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(コードへの追加に注意してください。)

于 2011-11-09T00:54:16.287 に答える
5

Carl Masak は最近 (2014 年後半) ipso を作成しました。これは現在の Rakudo で動作する"A metacircular Lisp in Perl 6"です。

P6 インラインと組み合わせる方法があります。詳細については、「スラング」を調べてください。たとえば、任意の言語の再帰的なインライン化を可能にするマクロ/スラングに関する最近のブログ投稿などです。

(P6ish) Lispの Damian Conway の Quicksort も参照してください。

于 2014-11-29T20:17:20.420 に答える
2

私の知る限り、Perl6 では強力な Lisp ライクなマクロを使用できます。たとえば、パーサーはその言語で利用できます。これにより、任意の言語を単なるインタープリターとしてではなく、Perl のサブ言語として実装できます。

池上の例では、彼はキーワードを導入しましたがlisp(xxx)、それはさらに簡単です。Lispxxx は、Lisp を解析して Perl6 に変換し、結果を返す単一のマクロである可能性があります。彼の例では、1 つの引数を取るコンパイル済みのネイティブ サブルーチンです。私はあなたが実際に使用するemacs Lisp関数も実装する必要があると思います. 実際には、Perl6 プリミティブを Lisp 構文で扱うのは簡単です。(+ 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 に答える