[HN Gopher] Easy Forth: Learn forth with REPL in the browser
___________________________________________________________________
Easy Forth: Learn forth with REPL in the browser
Author : guerrilla
Score : 94 points
Date : 2021-02-17 09:03 UTC (11 hours ago)
(HTM) web link (skilldrick.github.io)
(TXT) w3m dump (skilldrick.github.io)
| bmitc wrote:
| Forth is just fun.
| MaxBarraclough wrote:
| You're still thinking in infix notation!
|
| FUN FORTH IS
| joubert wrote:
| Missing the tone. :-)
| zabzonk wrote:
| I've written a couple of FORTH-like implementations - one way
| back when on a Z80 system, when I was learning Z80 assembler,
| running CP/M, and one on an IBM PC (the original kind, with
| clicky keyboard) when I was learning 8086 assembler and a bit of
| C++, as part of an adventure-writing system. Unfortunately, the
| code for both has got lost (no git back then), but I can strongly
| recommend writing a FORTH as a way of learning a new (non-FORTH)
| language.
| jonsen wrote:
| How do you press "the Enter key" on an iPad?
|
| My operators are just stacked with Return.
| exikyut wrote:
| For reference, what does the iOS keyboard you're seeing look
| like?
|
| Selecting the text field in Android just pops up my selected
| keyboard (Gboard), which includes an Enter key.
| jonsen wrote:
| I use the standard keyboard. Don't know what I can compare
| the look of it with. I've never seen or used an Android
| device. Maybe I can find a keyboard app with an Enter key.
| Munksgaard wrote:
| This is great! Forth is such an interesting language.
|
| Does anyone know of uses in industry?
| dastain wrote:
| You can install it on MCUs and use it to debug code pretty
| easily and makes it really nice to use reflection[1].
|
| This use is not necessarily limited to enthusiasts, since
| nowadays even Arduino ends up in commercial products.
|
| While the language itself it's considered difficult to read by
| some, it's a great way to access MCUs features in a stack-based
| way and at a level higher than assembly.
|
| 1. https://www.youtube.com/watch?v=dvTI3KmcZ7I
| s-macke wrote:
| In the gaming industry. The game Starflight was written in
| Forth.
|
| https://en.wikipedia.org/wiki/Starflight
|
| Ok, this is an ancient example. But still :-)
|
| The source code is partially available. Here one example.
|
| https://web.archive.org/web/20030906110447/http://www.sonic....
| MaxBarraclough wrote:
| See:
|
| * https://www.forth.com/resources/who-uses-forth/
|
| * https://vfxforth.com/#customers
|
| (Curiously this also turned up on another thread,
| https://news.ycombinator.com/item?id=26165804 )
| joubert wrote:
| Space.
| lebuffon wrote:
| The Fedex handheld terminal was re-written in Forth... twice.
| :)
|
| First time all the features wouldn't fit. Forth re-write fit
| with room to spare. (factoring is easy in Forth)
|
| New Hardware! Everything fit but batteries didn't last a full
| shift. :(
|
| Forth with a proprietary tasker put the device to sleep at
| every opportunity. Problem solved.
| Jtsummers wrote:
| > factoring is easy in Forth
|
| Even more than working in functional languages like SML,
| Forth (and RPL, my first stack language) taught me how to
| factor out code and remove/minimize duplication. It's just so
| obvious when using it where the duplication is, the hard part
| is coming up with decent names. But if a sequence of words
| can be given a good name, give it that name and define it.
| guerrilla wrote:
| According to Wikipedia[1] it's used in astronomy and aerospace.
| It's also used in OpenFirmware like in old PowerPC Mac and IBM
| computers.
|
| 1. https://en.m.wikipedia.org/wiki/Forth_(programming_language)
| rwmj wrote:
| Not sure if it counts as "industry" but FORTH-based Open
| Firmware is still used as a bootloader for some PowerPC
| machines. You can try this out under qemu: $
| qemu-system-ppc64 VNC server running on ::1:5900
| $ vncviewer :0 Ready! 0 > 1 2 3 * + . 7
| ok 0 > WORDS (gigantic list of built-in words ...)
| exikyut wrote:
| And FWIW Open Firmware runs on x86 too.
| jonsen wrote:
| Third line of the introduction:
|
| "...is still used today for certain applications."
|
| and is clickable.
| mikewarot wrote:
| I'm amazed that it worked so well, it did confuse me that each
| repl didn't know the previously defined functions, is that just
| me?
|
| Forth is _almost_ the postfix inverse of lisp. Instead of arity
| errors, you have stack over and underflow. And it only has one
| list, instead of lists of lists.
|
| Oh, and it's not garbage collected
|
| Oh, it it's not homoiconic
|
| {edit]I guess it's really not the same thing at all
|
| Amazing how a day's exposure to Racket shifted my opinion
| isaacimagine wrote:
| _Let Over Lambda_ has a section about leveraging Common Lisp 's
| macro system to make a Forth in a really clever way, IIRC.
| mumblemumble wrote:
| > Oh, it it's not homoiconic
|
| Is it as homoiconic as it needs to be? It's been a while since
| I've played with it in any real way, but, as I recall, Forth
| represents both data and code in exactly the same way: Blobs of
| data with no associated type information, that you're allowed
| to fiddle in any way you want, with no guard rails.
|
| So it seems like there's no reason you couldn't write some
| words for manipulating code every bit as easily as you could
| write some words for manipulating any other data.
|
| Lisp gives you a lot more out of the box, of course. But Lisp
| gives you a lot more of _everything_ out of the box.
| astrobe_ wrote:
| It depends on the implementation. With Indirect Threaded Code
| (ITC), "functions" are represented more or less as a list of
| other functions or primitives to call. But there are also
| classic bytecode-based Forth implementations, subroutine
| threaded code implementation (which is a simple form of
| native code generation), etc.
|
| In my experience, Forth's "immediate" words, which let you
| execute code at compile time, combined with the availability
| of some (or most) of the compiler's part, let you do quite a
| lot of things.
|
| In other words, you don't manipulate code, you directly
| generate code. For instance, if your implementation does not
| have 1+ (silly example), you can make a word "1+" that
| compiles "1 +" inline (or increment the top of stack if you
| interpret stuff from the REPL).
|
| To answer your question, I use a dialect of Forth that has, I
| think, less capabilities than standard Forth in this area and
| rarely felt the need to implement them. At the risk of
| showing I am a blub programmer, I think homoiconicity is
| overrated - for the user (for language implementers maybe
| it's another story).
| mikewarot wrote:
| Lisp can take a chunk of lisp code and operate on it
| directly... forth can't do the same.
|
| The big difference with forth is the inability to do things
| other than variables (fixed allocations) and use the stack.
| The handling of lists and garbage collected larger things on
| the heap are a huge advantage for the Lisper.
| RodgerTheGreat wrote:
| Forth doesn't need an abstraction for operating on threaded
| code; forth programmers routinely write their own words for
| control structures with an awareness of the internal
| structure of dictionary entries. You're operating on code-
| as-data, it's just an entirely different mechanism for
| doing so.
|
| It's entirely possible to work with dynamically allocated
| memory in a Forth that runs on top of some other operating
| system, like GForth. When you're on metal, you can build
| whatever kind of allocator you want. The primitives
| "create"/"allot" are just that- primitives.
|
| Here's a trivial example of building a cons-pair heap in
| Forth: https://gist.github.com/JohnEarnest/4522067
| RodgerTheGreat wrote:
| The comparison to Lisp always seems to pop up for some reason,
| but at the end of the day Forth draws very little, if any,
| inspiration from Lisp, and has very different functionality and
| evolutionary history. They are both "small" languages in some
| sense, but it is rare to see anyone claim that Brainfuck is a
| Lisp, or that they are somehow twins separated at birth if you
| turn your head to the right angle and squint.
|
| It is better to simply learn about Forth instead of attempting
| to hammer it into the mold of another language one has heard of
| before.
| mikewarot wrote:
| > It is better to simply learn about Forth instead of
| attempting to hammer it into the mold of another language one
| has heard of before.
|
| I knew Forth, I'm learning Racket (Lisp)... and I'd
| previously watched Uncle Bob Martin's talks about the quest
| for the ultimate programming language (Which at the time, he
| thought was Clojure)... it was then that I realized there is
| a continuum from Prefix (Lisp, etc) through infix (C, Pascal,
| Fortran, etc) to Postfix (Forth, Postscript, Cannon Cat, etc)
|
| Stoical is a Forth that handles lists, dictionaries, etc...
| it was implemented on the DEC PDP-11, and formed the basis of
| the RED editor. It was then ported to Linux by the author who
| later wrote DAW.
|
| I tried to revive it, but I don't really know C that well,
| and it made a LOT of assumptions about word size that I don't
| know how to get around in a 64 bit environment.
|
| I strongly suspect you could write Lisp in Stoical and vise-
| versa.
| fifilura wrote:
| It feels like I am running an emulator for my high-school HP-11
| RPN calculator!
| dastain wrote:
| Lovely, as other tools by Skilldrick. I've used Easy6502[1]
| before and forked it to customize it for a project of mine.
|
| I was just about to install Forth on an STM32 (blue pill) MCU,
| which is pretty nice![2]
|
| 1. https://skilldrick.github.io/easy6502/
|
| 2. https://www.youtube.com/watch?v=dvTI3KmcZ7I
| ilaksh wrote:
| Check out ColorForth. Or RaonbowForth online
| http://rainbowforth.appspot.com/
|
| https://youtu.be/N1FUY6g5crA
___________________________________________________________________
(page generated 2021-02-17 21:02 UTC)