Page 2 of 3

New community dev tool uploaded: alpha xForth Compiler

Posted: Sat Sep 12, 2020 9:04 pm
by mobluse

A limitation is that you cannot have definitions longer than 79 characters without newlines.

I had:


Quote




: .MATRIX ( R C -- ) SWAP 0 ?DO CR DUP 0 ?DO ." (" J 1 + . ." ," I 1 + . ." ) " LOOP LOOP DROP ; 5 3 .MATRIX



but had to change it to:


Quote




: .M SWAP 0 ?DO CR DUP 0 ?DO ." (" J 1 + . ." ," I 1 + . ." )" LOOP LOOP DROP ;

5 3 .M



But you can have it on several lines:


Quote




: .MATRIX ( R C -- ) SWAP 0 ?DO CR DUP 0 ?DO ." (" J 1 + . ." ," I 1 + . ." ) "

LOOP LOOP DROP ; 5 3 .MATRIX



I pasted in the long lines.


New community dev tool uploaded: alpha xForth Compiler

Posted: Sat Sep 12, 2020 10:17 pm
by mobluse

Can you write mutually recursive functions in this Forth? I noticed DEFER, IS, and DEFER@ doesn't exist.

https://rosettacode.org/wiki/Mutual_recursion#Forth


New community dev tool uploaded: alpha xForth Compiler

Posted: Sun Sep 13, 2020 12:15 am
by BruceMcF


3 hours ago, mobluse said:




A limitation is that you cannot have definitions longer than 79 characters without newlines.



Why is that a limitation? Just hit return and keep defining. Because you are not in interpret mode when you do the return, you will not get an "OK" prompt.


New community dev tool uploaded: alpha xForth Compiler

Posted: Sun Sep 13, 2020 12:25 am
by BruceMcF


4 hours ago, mobluse said:




Can you write mutually recursive functions in this Forth? I noticed DEFER, IS, and DEFER@ doesn't exist.



https://rosettacode.org/wiki/Mutual_recursion#Forth



For self-recursion, use RECURSE (and report if it works!)

For mutual recursion, you always COULD do it with variables, ' and EXECUTE ... DEFER IS and DEFER@ are just semantic sugar.

VARIABLE '2NDWORLD 

: 1STWORD ( n1 -- n2 ) ?DUP IF '2NDWORD @EXECUTE THEN ;

: 2NDWORD ( ... -- ... ) ... {whatever 2NDWORD does} ... 1STWORD ;

' 2NDWORD '2NDWORD !



Or, if you prefer:

VARIABLE '1STWORD

: 1STWORD ( n1 -- n2 ) '1STWORD @EXECUTE ;

: 2NDWORD ( ... -- ... ) ... {whatever 2NDWORD does } ... 1STWORD ;

:NONAME ( n1 -- n2 ) ?DUP IF 2NDWORD THEN ; '1STWORD !


New community dev tool uploaded: alpha xForth Compiler

Posted: Sun Sep 13, 2020 12:26 am
by mobluse


12 minutes ago, BruceMcF said:




Why is that a limitation? Just hit return and keep defining. Because you are not in interpret mode when you do the return, you will not get an "OK" prompt.



It's a limitation since you need to insert line-breaks. The source you paste from doesn't always have line-breaks (CR).



A related topic: In GForth they type "compiled" when they reach new-line (CR) and the definition is not finished, e.g.


Quote




: test 1 2  compiled

3 ;  ok



The "compiled" is useful feedback.


New community dev tool uploaded: alpha xForth Compiler

Posted: Sun Sep 13, 2020 12:38 am
by BruceMcF


2 hours ago, mobluse said:




It's a limitation since you need to insert line-breaks. The source you paste from doesn't always have line-breaks (CR).



A related topic: In GForth they type "compiled" when they reach new-line (CR), e.g.



The "compiled" is useful feedback.



CR is how the CX16 line input mode works. If you are copying and pasting on a 32bit or 64bit system into an emulator of an 8bit system, I guess you are just going to have to get the 32bit or 64bit system to be a bit smarter about how it does things. Might need to copy it into the system text editor, save it in a text format with CR, and INCLUDE it from there.

Mind, xForth is still alpha, including that there is no INCLUDE yet, but that is deferred pending emulator development. Since it is mostly necessary to open the file and made it the default input until EOF, and then make the console the default input again, most of the tools to do it will already be available from the first prototype BLOCK system.

I could also note that copy and pasting from an online source directly into xForth might be putting more faith in an alpha build than is warranted. Copy and pasting line by line and looking for smoke as you do might be a better protocol anyway.



Gforth is a much bigger Forth than xForth, which saves an ongoing log of every line entered if you run it correctly, so it would never have need to edit the text on the screen and run it again. Plus going back, editing it on the screen and hitting return doesn't work on any system that gforth runs on. I've already got OK as a NOP, but I am not going to make a word as potentially useful as "COMPILED" into a NOP too.

xForth is a port of eForth, which is generally used today on smaller microcontrollers, like AVR8's. It IS a lot more space conscious than gforth is. Indeed, 10K is far too big for the final release build of xForth ... once INCLUDE and SAVE4TH are working, some of what is now included in the base image are going to get sent off to a CORE.FS include script to make a less overweight base image size. 7K would be a lot more respectable for an eForth descended Forth.


New community dev tool uploaded: alpha xForth Compiler

Posted: Wed Sep 16, 2020 2:18 pm
by Gold

Awesome, I've been waiting for a Forth to be available on the x16. Looking forward to finally getting around to learning it.


New community dev tool uploaded: alpha xForth Compiler

Posted: Sun Sep 20, 2020 1:16 am
by BruceMcF

Excellent. For command line entry, it will already take you through chapters 1 and 2 of Starting Forth.

Starting Forth is (c) Forth Inc., and while they make it freely available at their site, they don't permit free redistribution. So get it online or PDF at:

https://www.forth.com/starting-forth/


New community dev tool uploaded: alpha xForth Compiler

Posted: Sun Oct 25, 2020 12:05 pm
by Gold

I've mostly been learning with gforth in the mean time. It seems like eforth (and by extension xforth) doesn't have a greater than word as default, is there any particular reason for that? All the ">" word seems to do is push 7 onto the stack.


New community dev tool uploaded: alpha xForth Compiler

Posted: Mon Mar 29, 2021 6:33 am
by BruceMcF


On 10/25/2020 at 8:05 PM, Gold said:




I've mostly been learning with gforth in the mean time. It seems like eforth (and by extension xforth) doesn't have a greater than word as default, is there any particular reason for that? All the ">" word seems to do is push 7 onto the stack.



Oops, haven't been tracking comments, since I was waiting on the $0000/$0001 in the emulator to start playing around with banking.

">" is not a CORE ANS Forth word, it is a CORE EXT word ... its meaning is standardized, but since it can be defined using two existing CORE words ... SWAP < ... minimal Forth's may omit it from the dictionary. Eforth attempts to be a minimal base wordset to simplify porting, and then additional words may be written on top of it ... or, if increased efficiency is desired, the words defined to allow a more efficient Forth to be coded using eForth.

gForth by contrast aims to be a more comprehensive ANS Forth, so AFAIR it has all of the CORE and CORE EXT words along with most of the other ANS wordsets ... the only exception that I can recall off the top of my head is the BLOCK implementation is provided in source code rather than included in the build by default. It also has most of the Forth 2012 words, since its two primary developers are active participants in the Forth20xx process.

When I have loadable scripts:

: > ( n1 n2 -- fl ) SWAP < ;

... would provide > as a convenience, but if someone wants > at present they can include that definition first.