in reply to Re^6: I wrote an expression parser for PPI
in thread I wrote an expression parser for PPI

> Yep, PPI worked

Not sure if you got my point.

PPI is a static parser, this (should?) mean if it sees at "compile" time something like ...

to keep on parsing correctly if it encounters a try {...}

I haven't tested this, but I bet you will need to patch PPI to handle this.°

At least if you want to construct a decent Perl dialect and not just some interesting demos.

I say dialect because it's very hard to achieve full compatibility.

OTOH once your parser and compiler really work, you can try to transpile it into your target languages to bootstrap a stand-alone dialect which is consistent in all those languages.

At least in theory...

Cheers Rolf
(addicted to the Perl Programming Language :)
see Wikisyntax for the Monastery

updates

°) There is a whole bunch of more things happening at compile-time...

Replies are listed 'Best First'.
Re^8: I wrote an expression parser for PPI
by BerntB (Deacon) on Jan 11, 2026 at 11:24 UTC
    Sorry, I was unclear. Yes, the use dependencies are loaded and prototypes (like in Try::Tiny) etc are extracted.

    I had a problem with this by the way, and realized why Perl don't cache its byte code. I wanted to do a cache of compiled code, with key from the hash of the file content. But it just seems too fragile. You would need a cache of used files (so they could be loaded) and everything would need a recompile if a file further down in the stack was changed. I put on the todo to compile a program with dependencies to a standalone code file, instead.

    Edit: If you tell me that Try::Tiny works with require, then I am totally wrong. :-) That should only work with use right? (I had to read the code, there was some claim that it was slow so I never Try:ed.)

      > the use dependencies are loaded and prototypes (like in Try::Tiny) etc are extracted.

      By standard PPI or by your project?

      update

      > and realized why Perl don't cache its byte code.

      Do you mean pre-compiling modules before a program starts?

      This wouldn't work in general and IMHO even not add much speed.

      I suppose re-compiling a module with every startup is negligible compared to starting Perl and loading the code from the file-system.

      But I've seen attempts to work with a precompiled bytecode versions of a program/module for compatibility reasons.

      IIRC they have the extension .plc, but I couldn't find the documentation yet.

      Cheers Rolf
      (addicted to the Perl Programming Language :)
      see Wikisyntax for the Monastery

        Uh, I don't understand what you are asking about PPI? But I wish I published earlier so you asked it a few weeks ago. :-) It is like this: A routine trawling some Perl code after use statements aren't hard to do with PPI, almost a oneliner. PPI works well for me. As it is, it will need to be two phases (first to find declarations). I will put up changes the coming weekend, I hope.

        This transpiler is in Perl, so it will be slower to compile than Perl (edit: for instance, see the deep dive into use:d files). In the end, it will probably be generation of a compiled file, with runtime etc. (Edit: I also saw tries with compiled bytecode, now I understand why it never became a thing.)

        Edit: I am trying to solve BEGIN now, that is trickier than sub prototypes. But totally doable in CL. The problem now, is that my attempt at a demonstration Perl transpiler to get something to compile to other languages is getting a too complex output.