[m-users.] Parsing source files / tem-rewriting

Sean Charles (emacstheviking) objitsu at gmail.com
Thu Aug 15 16:29:00 AEST 2024



> On 15 Aug 2024, at 04:18, Volker Wysk <post at volker-wysk.de> wrote:
> 
> Am Mittwoch, dem 14.08.2024 um 19:19 +0100 schrieb Sean Charles
> (emacstheviking):
>> Yes, I have resisted the urge to use it, Uncle Bens rule applies here!  :D
> 
> Hmm... I couldn't find out what Uncle Ben's rule is.

Ah, it's from a Spiderman movie:
"
https://en.wikipedia.org/wiki/With_great_power_comes_great_responsibility
With great power comes great responsibility
en.wikipedia.org
"

https://en.wikipedia.org/wiki/Uncle_Ben
Sorry!

> 
>> I am working on a FORTH engine in Mercury right now, it's going well, it
>> will basically expose the strictness of Mercury through a stack based
>> system... currently the core words are hand assembled but they have a very
>> common pattern so far, and when the dust settles I think there MIGHT be a
>> case for term rewriting to create that data.
> 
> You have a lot of projects. But what would you want to do with a Forth
> engine? Is it just for the fun of programming? ;-)

Well, a loooooooong time ago I wrote this, felt-lang.com <http://felt-lang.com/>, since then I have rewritten it in Haskell, SWI-Prolog and C as POCs but wasn't hasppy, then the Universe showed my Mercury. It's been a very rewarding journey since and lots of what I have learned has filtered into my daily coding, mostly improved rigour in thinking about things.

The concept of  a transpiler is not new, I've used HaXe in the past, but *I* have never written one, currently the Mercury version parses s-expressions into working C code, which compiles, but the more I got into the weeds, the more I realised that I wanted a faster REPL based interactive/explorative environment for the code render phase, with the view that users vould use a glue language for the AT-->Code part to do whatever they want with the parsed s-expression tree.

For reasons best known to me3, and to avoid triggering Greenspun's tenth law, I decided I needed a custom FORTH dialect and so now I find myself engaged in hand-to-keyboard, I already have implemented basic stack ops, basic arithmetic, and a bunch of words,


➜  mercury-merth git:(main) ✗ ./dstack
 > words

System words:
* + - -> . .S .SEEVM .STATUS .STRICT / /MOD : ; >IOP >IOW BYE CLEARSTACK CONSTANT CR DROP DUP ELSE EMIT ENDIF IF MOD OVER RECURSE ROT SEE SPACE SPACES SWAP THEN TYPE T{ WORDS }T 

User words:


 > : hv "Hello Volker!" type cr ;
New word defined: hv
 > words

System words:
* + - -> . .S .SEEVM .STATUS .STRICT / /MOD : ; >IOP >IOW BYE CLEARSTACK CONSTANT CR DROP DUP ELSE EMIT ENDIF IF MOD OVER RECURSE ROT SEE SPACE SPACES SWAP THEN TYPE T{ WORDS }T 

User words:
HV 

 > hv
Hello Volker!
 > 

I implemented the test words, T{ -> }T early on, and I copy the relevant tests from the Forth standards site and so far all passing which feels nice, for example, from https://forth-standard.org/standard/core/IF

"If/Else/Then" suite
T{ : GI1 IF 123 THEN ; -> }T
T{ : GI2 IF 123 ELSE 234 THEN ; -> }T
T{  0 GI1 ->     }T
T{  1 GI1 -> 123 }T
T{ -1 GI1 -> 123 }T
T{  0 GI2 -> 234 }T
T{  1 GI2 -> 123 }T
T{ -1 GI1 -> 123 }T


My dialect will expose all the Mercury basic types and modules, the stack only allows int and string at the moment but I have some planned features to allow a Lua like table structure, stack signature checking, there is NO coercion of types, as I say, under the hood I intend to 'expose' Mercurys world view into the dialect, it will be a strict strict puppy that's for sure,

The other feature I've designed is Forth->Mercury, by analysing the stack signatures, I plan to generate raw Mercury code so I use the engine for rapid prototyping of code, then it can be printed and incorporated into my custom IDE as I go, the IDE being written in Mercury too, still on paper that one but heavily inspired by 'that Doug Englebart demo' and the Squeak Smalltalk Morphic engine.

So much to do, so little time.

And, it's *always* for the fun of programming!

:D

Sean



> 
> Cheers,
> Volker
> 
>> 
>> Thanks again.
>> Sean
>> 
>> 
>>> On 14 Aug 2024, at 19:16, Volker Wysk <post at volker-wysk.de> wrote:
>>> 
>>> Am Mittwoch, dem 14.08.2024 um 19:10 +0100 schrieb Sean
>>> Charles (emacstheviking):
>>>> That's the chap!
>>>> 
>>>> Thanks Volker, I just could see it, my brain was convinced it was in a folder!
>>> 
>>> That thing is ridiculously small, for what it does.
>>> 
>>> Enjoy it!  :-)
>>> 
>>> Bye, 
>>> V.W.
>>> 
>>>>> On 14 Aug 2024, at 19:00, Volker Wysk <post at volker-wysk.de> wrote:
>>>>> 
>>>>> Am Mittwoch, dem 14.08.2024 um 18:29 +0100 schrieb Sean Charles
>>>>> (emacstheviking):
>>>>>> Hi,
>>>>>> 
>>>>>> There was an example of term rewriting but I cannot seem to find it
>>>>>> anywhere!
>>>>>> 
>>>>>> Is there any code I can leverage to scan a .m file and produce an AST or
>>>>>> at least scan the terms... I know the rewrite example pretty has all the
>>>>>> answers I need but I just can't find it.
>>>>> 
>>>>> I think you mean samples/expand_terms.m.
>>>>> 
>>>>> Cheers,
>>>>> Volker
>>>>> _______________________________________________
>>>>> users mailing list
>>>>> users at lists.mercurylang.org
>>>>> https://lists.mercurylang.org/listinfo/users
>>>> 
>> 
> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mercurylang.org/archives/users/attachments/20240815/d0cfe875/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: DreamHaven_May_30_2020_storeboards.jpg
Type: image/jpeg
Size: 194583 bytes
Desc: not available
URL: <http://lists.mercurylang.org/archives/users/attachments/20240815/d0cfe875/attachment-0001.jpg>


More information about the users mailing list