I looked at every concatenative language I could find to study their design (syntactically), I remember Listack.
While I am unsure what you mean by “write only”, Readymade is the furthest thing from “esoteric”. It’s intent is to be the simplest & easiest programming language to learn, understand, and use for someone with no knowledge of programming whatsoever.
It can expose any commonly useful “higher-level” constructs with nothing more than postfix notation, ASCII symbols, and self-awareness. For example, lets look at the ‘standard postfix conditional’ you mentioned; there is actually a lot of complexity going on here.
[boolean condition] [true branch] [false branch] if
For me to use this, I must know the stack order and that the conditional is called if.
This is fine enough, except the direction I normally read the English language is quasi-reversed in my code. So if what? Is there only a true branch with another if-else or ifElse or …?
This is all entirely arbitrary, but does it need to be?
#if [boolean condition] #then [true branch] #else [false branch] if
What is cool about this code to me are your comments, they are convenient and expressive. In fact by design, they encourage you to be: “single word comments”.
The point I am trying to make here is that your great contribution to programming theory is the basis of Readymade. Let me explain…
In this particular example, your comments are providing prefixed information about proceeding code. This is true both for the # sigil and not surprisingly, the content of your comments. This pattern of temporarily inverting notation turns out to be incredibly useful, just as mirrors are useful.
So I ask, can we express the above if construct in a manner that relies on nothing other than common sense and intuition, rather than external documentation? Can a language actually document itself?
The following will make more sense by reading the seemingly elementary doc/intro.m, but let’s say the following represent ‘true’ and ‘false’ respectively:
{+} {-}
This is also our construct for conditional checks of the same boolean value.
{+} {+ "this will print". }
{-} {+ "this will not". }
An if/else becomes {+- [] [] }, even use {-+ [] [] } because language is about expressivity and choosing to handle a false variant first is rather expressive in-and-of itself.
[boolean condition] {+- [true branch] [false branch]}
I do not play golf, such things do not interest me. The terse nature of the language is of utility and common sense. It both eases composition and exposes the underlying motion and patterns of the code.
We both know what dup and over could do, but are the words Chuck Moore happen to come up with one day really the best choice for those operations? 3-4 character length (English) words for the most basic operations of the language? Why?
Just use _ to express duplication and provide convenient indexing.
_ _1
Follow this concept to express all memory/core operations; that’s Readymade.
There is a stigma that using only ASCII symbols makes a language just a toy and not a serious tool to develop quality software. I would bet that someone with no prior-programming experience would be able to reliably learn and retain the builtins of Readymade significantly faster than any language based on English for the same reason a child learns to match shaped blocks before learning to read and write script.
There is also a similar stigma for languages with a shared stack. As someone who has developed your own concatenative language, you seem to refer to it as a “road you’ve gone down”. I am quite interested to know your viewpoint about such stigmas and how you view stack-based programming given your experience.