[HN Gopher] Om is a novel, maximally-simple concatenative language
       ___________________________________________________________________
        
       Om is a novel, maximally-simple concatenative language
        
       Author : memorable
       Score  : 131 points
       Date   : 2022-10-29 09:21 UTC (13 hours ago)
        
 (HTM) web link (www.om-language.org)
 (TXT) w3m dump (www.om-language.org)
        
       | mncharity wrote:
       | Has anyone seen use of a concatenative language, to build
       | vocabulary for broader programming language implementation? So
       | vocabulary for linkage and PICs and stacks and gc and threads and
       | so much else. Not merely "I have this language, so I'll implement
       | and tool it in itself", but moonshot "here's a vocabulary to
       | start implementing other languages... all other languages".
       | Aspiring to implement a C, a V8, an OCaml, and more. Perhaps with
       | bootstrap aids on the side, like a Z3 prover. Sort of like a lisp
       | machine approach, with an integrated commonality from low-level
       | bit twiddling to OS to AI. But with a Racket or Poplog flavor of
       | scaffolding language-like platforms on which to stand. Something
       | like a forth bootstrap, but which doesn't stall out having
       | reached forth, but keeps going, describing a richer and richer
       | space of computation. Has anyone seen anything remotely like
       | that?
        
         | downvotetruth wrote:
         | > describing a richer and richer space of computation
         | 
         | So, changing the compiler from targeting a stack / finite state
         | machine to registers (NP complete)?
         | 
         | https://en.wikipedia.org/wiki/Concatenative_programming_lang...
         | 
         | Changing the available static / compiled features of a language
         | is usually offered with compiler flags or keywords.
        
           | thechao wrote:
           | Why would using registers make it NP complete? Is there a
           | reason concatenative languages aren't (naturally) primal
           | chordal graphs?
           | 
           | I mean other than the conservative approximation being to
           | assume it is not?
        
       | brokenkebab2 wrote:
       | Interesting idea. Though maximally-simple claim doesn't look
       | warranted to me. It feels more complex than most of Forth
       | incarnations.
        
         | colomon wrote:
         | Right? Its creator obviously knows Forth, but it feels like
         | they've gone to extreme lengths to make it prefix rather than
         | postfix, at the price of making it much more confusing than it
         | needs to be? It's really not obvious to me that if they were
         | both equally complete, there'd be any advantage at all to
         | choosing this over Factor...
         | 
         | (That said, I did a lot of Forth programming in the old days,
         | and while I am utterly intrigued by Factor, I've never managed
         | to write anything useful in it...)
        
           | gre wrote:
           | We have a Factor Discord if you want some help starting out!
           | 
           | https://discord.gg/QxJYZx3QDf
        
             | gautamcgoel wrote:
             | Wow, somehow I thought Factor died. I know Slava stopped
             | working on it several years ago.
        
           | samatman wrote:
           | The advantage is that the language isn't stackful.
           | 
           | This is about more than just underflow, there isn't a stack
           | at all. Missed arity is a syntax error, not a mistake in
           | reasoning about the program state.
           | 
           | I'm not sold on Om's solution, I doubt the author was either
           | since it's frozen in time. I have long wondered about a good
           | prefixed concatenative language, without really getting
           | anywhere. Om seems too much like inside-out Joy, although I'm
           | not sure I could justify that impression in detail.
        
             | mostlylurks wrote:
             | Stackfulness and the possibility of stack underflows are
             | not actually constrained in any significant manner by
             | whether or not a language uses prefix or postfix notation,
             | and it would be more-or-less trivial to reject arity
             | mismatches in a postfix language as well.
             | 
             | The one real advantage that prefix notation has is that it
             | is familiar, since it is so widespread in mathematical
             | notation. Though that particular advantage would optimize
             | the experience of using a language for people new to
             | programming or that particular language, whereas it might
             | realistically make more sense to optimize for the
             | experience of people already familiar with a language,
             | since those will constitute the vast majority of
             | development time in any serious language, and I would argue
             | that postfix notation has an advantage there in most
             | domains.
        
           | astrobe_ wrote:
           | That happens too often with Forth. Someone gets interested,
           | thinks it would be sooo awesome to add this and that _"
           | modern"_ feature, and then they end up with something that
           | combines the disadvantages of Forth with the complications of
           | what they've added. An oddity nobody wants to use, and yet
           | another bit-roting carcass is some CVS.
           | 
           |  _It is practically impossible to teach good programming to
           | students that have had a prior exposure to BASIC: as
           | potential programmers they are mentally mutilated beyond hope
           | of regeneration_ [1]
           | 
           | I think that Forth only works with people who've started with
           | assembly programming. Someone who started with a high level
           | language suffered that sort of brain damage that make them
           | unable to feel complexity even when it coils around them and
           | give them a hard time breathing.
           | 
           | [1] https://www.cs.virginia.edu/~evans/cs655/readings/ewd498.
           | htm...
        
             | diffxx wrote:
             | > I think that Forth only works with people who've started
             | with assembly programming. Someone who started with a high
             | level language suffered that sort of brain damage that make
             | them unable to feel complexity even when it coils around
             | them and give them a hard time breathing.
             | 
             | What I find interesting about Forth is that it is a
             | language that is simultaneously a high level language and a
             | low level language. It encourages the programmer to write
             | high level programs but if they need to write low level
             | assembly routines for maximal performance, they can (though
             | they may need to write their own Forth interpreter to do
             | so).
             | 
             | I believe that the viral spread of c and unix is possibly
             | the worst thing that ever happened to computing. There is a
             | quote attributed to a physician named Vincent Felitti in
             | the context of addiction: it's hard to get enough of
             | something that almost works. This is the story of c. It is
             | neither a high level language nor a low level language and
             | is thus the worst of both worlds. We've added a staggering
             | amount of complexity to work around the limitations of c,
             | which have also infected most of our other supposedly high
             | level languages, e.g. java, go, rust, etc. To your point
             | though, because we know no other way, we can't even see
             | that much of this complexity is largely unnecessary.
             | 
             | Much of this goes back to Gabriel's observations in the
             | rise of worse is better: https://www.jwz.org/doc/worse-is-
             | better.html. What I think Gabriel doesn't fully articulate
             | is that worse is better is an essential feature of market
             | capitalism. The most profitable customers are addicts. Most
             | of the time, you can't just sell them something that is
             | complete garbage. The best thing to sell is something that
             | is almost good enough and that the customer is not
             | empowered to improve themselves. Then they have to keep
             | coming back to you for updates. Why would you sell a
             | customer a complete program that does exactly what it is
             | meant to do and nothing else when you could sell them
             | something incomplete that you can keep repeatedly selling
             | back to them?
             | 
             | This is the water that we swim in, and it sure seems to me
             | that we're all having a hard time breathing.
        
               | brookst wrote:
               | I've sold many an incomplete product and made money from
               | improving it over time.
               | 
               | From my perspective, exploiting addicts and capitalism
               | never entered into it; that's just how MVP and customer-
               | focused development work. Making money from the MVP
               | validates the general direction and developers are
               | incentivized to improve utility to generate additional
               | cash flow.
               | 
               | Projects that seek to deliver a complete and optimal
               | solution day one generally fail because the creators
               | don't have a complete and optimal understanding of
               | customer need. Plus it takes forever and creators need to
               | eat while working.
        
       | guerrilla wrote:
       | Looks like Forth but more complicated to me...
        
         | apgwoz wrote:
         | It's heavily inspired by Joy
         | https://en.wikipedia.org/wiki/Joy_(programming_language) from
         | the looks of it.
        
       | garganzol wrote:
       | Looks like an intriguing idea but it lacks examples except the
       | "Hello world" at the bottom of the page. But it's not enough!
       | More examples please.
        
       | Garlef wrote:
       | Could someone explain this bit from the intro to me?
       | 
       | > Recursion is very efficient in the Om language, due to (a) the
       | "eager" evaluation model enabled by prefix concatenative
       | syntax...
       | 
       | How is the syntax of any relevance for the evaluation model?
       | 
       | Once the AST is parsed, the syntax is gone and we're just left
       | with pairs of 'operator' and 'operand'.
        
         | Garlef wrote:
         | Another question about the syntax: Why are the curly braces
         | also part of the syntax for operators? They are delimiters for
         | the operands but also play some part in the definition of
         | operators? Is this solving some problem or did the author just
         | like curlies?
        
           | myco_logic wrote:
           | If you're talking about the curly braces after the backtick
           | in the syntax diagram for operators, I think that's just a
           | way to escape those special characters so you can use them in
           | operator names. It would be the same as escaping a double
           | quotation mark in a string literal with a backslash, i.e:
           | "\""
        
             | Garlef wrote:
             | Merci. Thets also the explanation I came up with for
             | myself. And I guess it allows for some trickery with
             | unquoting.
        
         | nine_k wrote:
         | The syntax allows to describe structures in a way that makes
         | the evaluation model efficient, or even possible.
         | 
         | Look at what lengths one has to go constructing a Y combinator
         | when syntax does not allow to refer to the current expression
         | to simply describe recursion.
        
       | carapace wrote:
       | FWIW, I've been playing around with Joy (Manfred von Thun's
       | concatinative language) and there's definitely "something there"
       | IMO.
       | 
       | For one thing, I've come around to the view that syntax is waaaay
       | over-emphasized in our current languages. The way I like to put
       | it is _syntax is a MacGuffin_ , "an object, device, or event that
       | is necessary to the plot and the motivation of the characters,
       | but insignificant, unimportant, or irrelevant in itself." You
       | have to have some syntax to write programs, but not nearly as
       | much as we typically use. I haven't dug into Om yet, but Joy
       | feels like the simplest useful language. (BrainF*ck is simpler
       | but harder to use, Lisp and Forth are more complex.)
       | 
       | For another, the concatinative systems seem to be simpler to
       | reason about than Lambda Calculus-based systems (most current
       | PLs.) What I mean is, these languages fulfill Backus' vision of
       | FP systems wherein you can derive programs by doing algebraic
       | manipulation of programs. (You can do this in any language, of
       | course, but Joy et. al. seem to make it especially easy.) I
       | suspect this has something to do with Category Theory (see
       | http://conal.net/papers/compiling-to-categories/ )
       | 
       | All this to say, if you haven't already, do have a look at
       | Concatinative languages.
        
         | heynowheynow wrote:
         | Well, LISP too. Define, compose, and apply. Barely above a
         | common language of math and mirroring many languages' parsed
         | AST of equivalent constructs.
         | 
         | People enjoy using simple things in a "worse is better"/paradox
         | of choice way. Unfortunately, simple doesn't do threading,
         | exceptions, side-effects, or C library linkage. Simple doesn't
         | scale when you need a deploy button, a backup and restore
         | button, firewall rules API, monitoring logic, or a scale-
         | to-5000-stateless-nodes-behind-a-proxy supervisory service.
        
       | jansan wrote:
       | A "Hello World" code example would be worth more than 1000 words.
        
         | thom wrote:
         | There's an examples section way, way down the page. I do agree
         | that language homepages should probably start with this, that's
         | how my brain works anyway.
        
         | superdimwit wrote:
         | There's a Hello World on the page
        
           | eternalban wrote:
           | No, that is not a program emitting to output stream "hello,
           | world!"
           | 
           | It emits "{Hello, world!}" which is like emitting "func
           | main() { print("hello, world!" } }"
           | 
           | A hello, world for this language would take "hello, world" as
           | an _operand_ to some _operator_ that spits out strings. That
           | example is not there.
        
             | xiphias2 wrote:
             | If you read the description the language outputs programs.
             | If it would be able to output any string, it wouldn't be
             | concanative language anymore.
        
         | [deleted]
        
       | jboynyc wrote:
       | I found some context about this project in a comment by its
       | creator: https://news.ycombinator.com/item?id=5098216
        
       | heynowheynow wrote:
       | Perhaps I missed it, but I was hoping for currying and
       | application.
        
       | [deleted]
        
       | jp0d wrote:
       | There isn't much activity on Github. The last release was nine
       | years ago and all the code contributions are from a single
       | person.
       | 
       | https://github.com/sparist/Om
        
         | heynowheynow wrote:
         | Lack of activity means lack of activity. Code doesn't evaporate
         | if the API hasn't broken promises like a javascript library
         | does every other week.
        
         | brokenkebab2 wrote:
         | How's this important for a project which is obviously an
         | experiment in PLs field? You either interested in such things,
         | or not, nothing else applies.
        
           | remram wrote:
           | The website mentions that it is "not complete" and that "the
           | intent is to develop it into a full-featured language".
           | 
           | This is pretty different from your characterization as a
           | finished experiment.
        
           | JasonFruit wrote:
           | I don't know, maybe someone wanted to try writing a program
           | in it, which seems not irrelevant to programming languages.
           | To most people, even an experimental programming language
           | isn't just an _objet d 'art_; it's more like an ornate tennis
           | racket, and it doesn't look like this one will ever be
           | strung.
        
             | jp0d wrote:
             | Thank you. Aptly written. Even if the idea is fantastic, if
             | not much happens for years, it's almost safe to assume that
             | the product is sort of dead. But it kind of depends! An old
             | academic language like Standard ML might not get a lot of
             | action on its repo (actually gets updated frequently), I'd
             | still use it as it forms the basis of several successor
             | languages.
        
             | rtepopbe wrote:
             | Just because it hasn't seen activity in awhile doesn't mean
             | it can't be used at all.
             | 
             | Sure, you're not going to want to start up a major project
             | with a long-abandoned language experiment, but frankly it's
             | not much of a step down from even an active language
             | experiment.
             | 
             | I suppose it's got a greater chance of being harder to get
             | going, but so much of that depends on how it was built in
             | the first place that simply being older isn't enough
             | information make much of a guess on that either.
        
               | JasonFruit wrote:
               | The home page is careful to point out that it lacks a lot
               | that would be needed to make it capable of doing
               | interesting and useful things:
               | 
               | > ...the software is currently at a very early "proof of
               | concept" stage, requiring the addition of many operations
               | (such as basic number and file operations) and
               | optimizations before it can be considered useful for any
               | real-world purpose.
        
             | canadianfella wrote:
             | > objet d'art
             | 
             | Why french?
        
               | JasonFruit wrote:
               | That's a reasonable question, and one I asked myself. I
               | considered some options:
               | 
               | - "Piece of art" didn't communicate engagement with the
               | item as art
               | 
               | - "Work of art" is often used to mean a masterpiece
               | 
               | - "Artwork" is a neologism of the sort I avoid
               | 
               | Finally, " _objet d 'art_" communicates appreciation _as_
               | art, but not necessarily any artistic quality, and it 's
               | a phrase people use in this context.
               | 
               | While we're asking irrelevant questions, why are the
               | majority of your comments questions and criticisms of
               | trivial matters of wording? Obviously, we agree that
               | words are important, but it's equally important to engage
               | with the intended meaning of those words.
        
               | chowells wrote:
               | Why do you think it's French? The term has developed a
               | distinct meaning among speakers of English. It has
               | slightly different connotations than alternative phrases,
               | as the sibling comment points out.
               | 
               | It may be derived from French, but it has a distinct
               | meaning in English. You might as well ask why someone is
               | using French when they say they're going to see a ballet.
               | It's a feature of English (and really, most languages)
               | that foreign words and phrases are often imported and
               | given connotations distinct from both the meaning in the
               | language of origin and from other words or phrases in
               | English. Once that adoption is widely recognized, is it
               | really not English?
        
       | asdfasdfasdfggg wrote:
        
       | sparist wrote:
       | Original author here. Didn't expect my little hobby project to
       | land on the front page of Hacker News. In the midst of a complete
       | rewrite of the language which I unfortunately only get to nibble
       | at here and there; will hopefully publish it soon.
        
         | myco_logic wrote:
         | As a concatenative language lover/designer I just thought I'd
         | put it out there how much of an inspiration Om has been to me,
         | I absolutely adore your language! Om is one of the most
         | beautiful programming languages I've ever seen, and surely one
         | of the most unique too.
         | 
         | Most other concatenative languages are Joy/Factor-esque stack
         | languages, so to see an entirely different vision with your
         | prefix notation is an absolute delight . Your panmorphic type
         | system is also genius (the only other language I know of that
         | has something similar is TCL). The way you treat whitespace
         | separators in your syntax is also very clever, I love that it
         | basically enables one to encode strings without a dedicated
         | literal syntax element.
         | 
         | Anyway, I just wanted to let you know how much I appreciate
         | your design and implementation efforts. I hope your rewrite is
         | going well, and I look very much forward to its eventual
         | release...
        
         | unsafecast wrote:
         | I'm glad to know you're still working on it! I thought the
         | current Om was a finished experiment.
         | 
         | By the way, your language has been a big inspiration for my own
         | designs. Thanks!
        
       | culi wrote:
       | Surprised it doesn't show up on PLDB:
       | 
       | https://pldb.com/index.html
        
       ___________________________________________________________________
       (page generated 2022-10-29 23:01 UTC)