[HN Gopher] Forth vs Lisp
       ___________________________________________________________________
        
       Forth vs Lisp
        
       Author : monological
       Score  : 49 points
       Date   : 2021-11-16 17:31 UTC (1 days ago)
        
 (HTM) web link (wiki.c2.com)
 (TXT) w3m dump (wiki.c2.com)
        
       | eatonphil wrote:
       | It's about as fun and easy to implement a simple thing that looks
       | like a forth as it is to implement a simple thing that looks like
       | a lisp. But that's where the ease of forth ends for me.
       | 
       | I find forth basically impossible to read even when, at best,
       | authors leave a comment on basically every 1-2 words. Writing it
       | is pretty hard too.
       | 
       | In contrast it's about as easy to be productive in a lisp (CL or
       | Scheme) as it is in Python or JavaScript (give or take useful 3rd
       | party libraries).
       | 
       | Even if they're from the same time period and are interesting for
       | being not very Algol-like, I don't think it makes a lot of sense
       | to discuss Forth and Lisp in the same conversation. They were
       | both improvements on very different things.
        
         | coliveira wrote:
         | If you read "Thinking in Forth" you'll discover that Forth can
         | be more readable than other languages, if you write in the
         | style that is supported by the language. Of course, if your
         | goal is to use the same algorithm as in, for example, Java,
         | your code will look terrible.
        
           | eatonphil wrote:
           | Thanks! I have read that book.
        
             | agumonkey wrote:
             | How do you feel about haskell point-free or function
             | oriented programming ? Some times it feels a bit like forth
             | (lots of tiny combinator that can feel obscure).
             | 
             | Just asking, I'm no expert neither in Forth nor Haskell..
             | just curious about your opinion
        
         | voxl wrote:
         | This is just personal preference. I find lisp impenetrable and
         | parenthetical soup. But I can read pipelined function calls (in
         | e.g. OCaml or Haskell) easily.
        
           | jedimastert wrote:
           | > I find lisp impenetrable and parenthetical soup
           | 
           | I think part of this is the somewhat idiosyncratic indenting
           | style, where closing parens are gathered together instead of
           | their own line like curly brackets in C-style syntax. It ends
           | up being somewhat similar to python, in that if a lisp
           | program is indented "properly" you should be able to ignore
           | the pileup of closing parens that tend to happen at the end
           | of a long expression, and even the open parens, and see the
           | structure for what it is.
           | 
           | I found that Parinfer's introduction helped me a ton in this
           | regard <https://shaunlebron.github.io/parinfer/>
        
           | kazinator wrote:
           | Even if so, a compiler can read your Lisp code and find
           | errors that are run-time problems in Forth.                 $
           | cat errors.tl       (defun bad ()         (length (cons 3)
           | x))       $ txr -e '(compile-file "errors")'
           | errors.tl:2: warning: length: too many arguments: max 1,
           | given 2       errors.tl:2: warning: cons: too few arguments:
           | needs 2, given 1       errors.tl:2: warning: cons: constant
           | expression (cons 3) throws       errors.tl:2: warning: cons:
           | constant expression (cons 3) throws       errors.tl:2:
           | warning: unbound variable x
           | 
           | All that matters in readability is is how easily you can spot
           | the error in bad code, and convince yourself that good code
           | is good, taking into account and advantage all the available
           | tooling.
           | 
           | Forth is implementable in a tiny amount of space, and can
           | produce fast executions. It can be fast when interpreted, and
           | supports a straightforward compilation model. These are
           | worthwhile qualities. Every computer scientist should know
           | about Forth.
        
           | eatonphil wrote:
           | My point is that Forth's general goal is to be a higher-level
           | assembly language for embedded systems.
           | 
           | Common Lisp and Scheme's general goal is to be a high-level
           | programming language for application development (also PL
           | research in Scheme's case).
           | 
           | By general goal I mean what you could ultimately guess the
           | focus is based on the implementation decisions and how the
           | community uses the implementations.
           | 
           | They both do a good job but in very different situations.
        
             | K0balt wrote:
             | I would beg to differ that that is the "goal" of forth, but
             | I do think that there is truth to the statement in terms of
             | niches best served when used by most programmers.
             | 
             | Writing in forth is a process of creating a domain specific
             | language to solve the problem at hand, so it tends to get
             | quite claustrophobic as you close in on the goal.
        
               | eatonphil wrote:
               | Yeah I tried to clarify. I am not an authority on their
               | literal goal. I was trying to describe the result when
               | you look at the systems overall in terms of
               | implementation and use; what they make easy.
        
             | Karrot_Kream wrote:
             | At high levels (meaning you've built up some nice Forth
             | words), I disagree. The main difference is that most Lisps
             | and Schemes have a GC, so you're not in charge of
             | allocating/freeing memory like you would in Forth. That
             | doesn't stop Forth words from implicitly referring to a
             | variable that actually contains memory allocation addresses
             | and hiding the actual underlying details of the allocation.
             | 
             | I think Forth certainly starts you out at a level of
             | abstraction only somewhat more rich than an assembler while
             | a Lisp runtime certainly abstracts more away from you, but
             | once a Forth has been built-up, they become similar. Gforth
             | gets a lot of flack in the Forth community for not being
             | minimal, but it's a good example of a feature-rich Forth
             | with support for things like exceptions, filesystems,
             | sockets, and more. The Forth community itself is split into
             | broadly two camps. The minimalist camp, (where Chuck Moore
             | likes to live) which believes in bringing up custom Forths
             | for custom platforms, creates small Forths that try to
             | limit abstraction. The more featureful ANS Forth community
             | tries to focus on a more batteries-included experience and
             | these have more in common with most Common Lisp and Scheme
             | runtimes.
        
               | eatonphil wrote:
               | Yeah I can see that but, to make a comparison, just
               | because you can build up high level functions in assembly
               | doesn't make it a comparable language to
               | Python/JavaScript.
        
               | Karrot_Kream wrote:
               | I think Forth is unique in that you actually can be both
               | high-level and low-level productive in a single "system",
               | but I can also see the perspective that high-level Forth
               | is more of just a concatenative language than a high
               | level Forth as such. Regardless I think Forth's power is
               | that it can be both a very low level language or a high
               | level runtime.
        
         | kazinator wrote:
         | Also, when we talk about reading code, the reading that matter
         | is this:
         | 
         | - how easily can you read incorrect code and find the problem.
         | 
         | - how easily can you convince yourself that correct code is
         | correct.
         | 
         | x86 assembly language is highly readable: e.g. it's completely
         | unambiguous that "xor eax, eax" clears the eax register,
         | independently of the previous or following line of code.
         | 
         | An x86 assembler can tell you that "xor eax" is missing an
         | operand.
         | 
         | In Forth, a word can receive insufficient arguments due to
         | something distant in the program, not related to that word.
         | 
         | For instance, suppose we push 200 operands onto the stack (o1
         | o2 o3, ...), followed by words which are supposed to decimate
         | those operands down to one value. Then suppose we remove some
         | operand in the middle, like o17. There will necessarily be a
         | stack underflow. But that underflow will not necessarily happen
         | inside that word which operates on o17. That word will
         | cheerfully use o18 as its argument, thinking that it's o17. It
         | is the word which operates on o1 that will bomb; at that spot
         | in the execution when the correct code would pull o1 from the
         | stack, the stack will be empty.
         | 
         | That's a pretty stupid thing to to do yourself for the sake of
         | being able to implement a language in one weekend.
        
       | joe_the_user wrote:
       | The upshot of the discussion seems to be that the definitions of
       | a Lisp and a Forth are so orthogonal that one person correctly
       | say "most lisps have no relations to forth and vice versa" and
       | another can correctly say "look, a lisp that's also a forth".
       | 
       | How conceptual orthogonality works.
        
       | lizknope wrote:
       | I remember using some Sun workstations in the 1990's. They Open
       | Firmware boot system used Forth. It was also used for PowerPC
       | Macs but I never had any of those.
       | 
       | https://en.wikipedia.org/wiki/Open_Firmware
        
         | agumonkey wrote:
         | open firmware was still default in mac up until ~2008 (I bought
         | a mac mini to play). I'm not sure it's still there though.
        
         | eatonphil wrote:
         | The FreeBSD bootloader was written in Forth for a while. It
         | looks like they may have transitioned off it to Lua by now.
         | 
         | https://marc.info/?l=freebsd-current&m=153469833911665&w=2
        
         | spijdar wrote:
         | Open Firmware is still used by IBM Power servers, although not
         | as the "actual" bare metal firmware[1]. It's instead the
         | default firmware interface for the standardized "VM", PAPR. A
         | cut-down variant called SLOF is shipped with QEMU for this
         | purpose, either for full emulation, or combined with KVM on
         | Power hardware for accelerated virtualization.
         | 
         | [1] Technically there's nothing preventing bare metal hardware
         | from implementing PAPR, but to my knowledge, no currently
         | produced hardware does. Same direction that Sun went with their
         | servers late into the game, not long before their acquisition;
         | sun4v ran everything inside LDOMs, with the default
         | configuration giving all resources to a single LDOM, IIRC.
        
       | macintux wrote:
       | As someone who has only _barely_ dabbled in either, they feel
       | very similar in philosophy, but I understand that 's superficial
       | to some degree.
       | 
       | I have a particular soft spot for Forth in part because W.
       | Richard Stevens (RIP) wrote a primer for Kitt Peak National
       | Observatory:
       | 
       | http://www.forth.org/KittPeakForthPrimer.pdf (PDF)
        
         | mananaysiempre wrote:
         | Very similar philosophies re building up abstractions, DSLs and
         | DSL-enabling syntax (half of _Thinking Forth_ is essentially
         | proselyzing DSLs), very different philosophies re lowest level
         | of abstraction accessible in the language and compound
         | datatypes. I'd say that neither of those are superficial.
        
       | zerr wrote:
       | Any reasons to code in Forth these days, besides intellectual
       | exercise?
        
         | qsort wrote:
         | It's very easy to bootstrap and can be made Turing-incomplete
         | if needed. Bitcoin script is a Forth IIRC.
        
           | whartung wrote:
           | Speaking of this, I've always loved this paper [1] about
           | Forth. And it's a real eye opener. It's a real eye opener
           | when you understand that primitives such as assignment and
           | variable references are, indeed, in Forth, actual primitives.
           | Primitives that can be readily changed.
           | 
           | Combine this with a venerable Forth (cross)assembler and it's
           | pretty powerful for all of its simplicity. This is
           | bootstrapping without even a boot, just need a sniglet.
           | 
           | [1] https://pygmy.utoh.org/3ins4th.html
        
       | dang wrote:
       | One old thread:
       | 
       |  _Forth vs Lisp_ - https://news.ycombinator.com/item?id=2243877 -
       | Feb 2011 (15 comments)
        
       | mikewarot wrote:
       | As someone who has written a forth, and knows a tiny sliver of
       | what lisp can do, the huge difference is that Forth can't deal
       | with arbitrary data structures in anything close to the ease of
       | Lisp. If you want to ingest a chunk of source code, tokenize,
       | parse and put it all in an abstract syntax tree, you're far
       | better off doing it in lisp.
       | 
       | Forth doesn't really do data structures. Stoical is a forth
       | variant that did, but it died out.
        
         | 7thaccount wrote:
         | There are a lot of Lisps out there, but even more Forths (like
         | the one you've written), although people like to argue what it
         | means to be a Forth.
         | 
         | One desktop/server Forth that I have enjoyed is 8th and it is a
         | Forth in the since that it is a concatenative language using
         | words and a stack, but it also is like GForth in that it comes
         | with garbage collection, while it also has support for various
         | data structures like arrays/maps/JSON/matrix, file IO, GUI,
         | database, cross compilation...etc. It still takes my brain
         | awhile to use, but my workflow is pretty similar to the one I
         | use with Python.
        
       ___________________________________________________________________
       (page generated 2021-11-17 23:00 UTC)