[HN Gopher] The original ABC language, Python's predecessor (1991)
       ___________________________________________________________________
        
       The original ABC language, Python's predecessor (1991)
        
       Author : tony
       Score  : 129 points
       Date   : 2025-11-28 19:58 UTC (1 days ago)
        
 (HTM) web link (github.com)
 (TXT) w3m dump (github.com)
        
       | dvdkon wrote:
       | Nice find. This looks like the best introduction to the language
       | in the repo: https://raw.githubusercontent.com/gvanrossum/abc-
       | unix/refs/h...
        
         | nuancebydefault wrote:
         | Wow 2 * 1000 without rounding errors, 40 years ago this must
         | have been super impressive, since I find that quite a feat of
         | today's python.
        
           | nick__m wrote:
           | 2 * 1000 is 2000 ;)
           | 
           | I think you meant 2**1000
           | 
           | the syntax for formatting ate your star
           | https://news.ycombinator.com/formatdoc
        
             | nuancebydefault wrote:
             | Oh that's why i did not get any upvotes /i
        
             | swores wrote:
             | For anyone else who, like me a moment ago, doesn't know the
             | meaning of ** but is curious: it's how many (but not all)
             | programming languages express "to the power of", aka
             | 2**1000 = 2^1000
        
               | pansa2 wrote:
               | > _2**1000 = 2^1000_
               | 
               | The reason for using `**` is that `^` is widely used for
               | bitwise exclusive-or. So commonly `2**1000 != 2^1000`!
        
               | kragen wrote:
               | I think Fortran used ** because EBCDIC didn't have ^ or
               | uparrow. ABC and Python followed Fortran rather than C on
               | this point. units(1) supports both.
        
               | shawn_w wrote:
               | C uses ^ for bitwise xor and a function for
               | exponentiation, though.
        
               | vanderZwan wrote:
               | He's explaining that C was not the reason for picking *
               | over ^
        
               | kragen wrote:
               | No, C does not have an exponentiation operator! Possibly
               | you meant "and _not_ a function for exponentiation ".
               | 
               | I should have said "followed Fortran rather than BASIC".
        
               | shawn_w wrote:
               | I meant exactly what I said. C uses a function for
               | exponentiation. Nothing that uses ^ for powers follows
               | C's lead.
               | 
               | https://en.cppreference.com/w/c/numeric/math/pow.html
        
               | kragen wrote:
               | Oh, I interpreted "a function for exponentiation" as
               | being part of a list of things C uses ^ for. It didn't
               | even occur to me that the sentence had an alternative
               | parsing where it was part of a list of things C _uses_. C
               | does indeed use a function for exponentiation. And time
               | flies like an arrow!
        
               | vincent-manis wrote:
               | BCD, actually, given that Fortran dates from the
               | mid-1950s. EBCDIC only appeared more or less around
               | Fortran IV, in the early 1960s. Many printers in those
               | days had a 48-character chain/train. After upper-case
               | letters, digits, and a few essential punctuation marks
               | (like . and ,), you weren't left with many options. The
               | 60-character set of PL/I was a luxury back then, let
               | alone lower case.
        
               | kragen wrote:
               | Hmm, I guess you're right. Also EBCDIC _does_ have ^
               | apparently, though not |:
               | https://en.wikipedia.org/wiki/EBCDIC#Code_page_layout
               | 
               | But IBM's BCD character sets, including the 48-character
               | ones you allude to, didn't: https://en.wikipedia.org/wiki
               | /BCD_(character_encoding)#Examp... (though Honeywell's
               | did)
               | 
               | There are a lot of decisions in Fortran that stem from
               | the absence of useful characters. .LT., .LE., .EQ., .NE.,
               | .GT., and .GE. is another.
        
               | swores wrote:
               | Interesting, thanks!
        
               | fainpul wrote:
               | And != means [?]
        
             | Lucasoato wrote:
             | Wow, I didn't know that you could write
             | like         this           for             code
             | blocks
        
               | jockm wrote:
               | It's been around since at least occam, maybe longer
        
           | doug-moen wrote:
           | Lisp has had arbitrary precision arithmetic since the early
           | 1970s. So did dc on Unix, also in the early 1970s. ABC didn't
           | arrive until 1987.
        
           | aidenn0 wrote:
           | Python 3.11.13 (main, Jun  3 2025, 18:38:25) [GCC 14.3.0] on
           | linux         Type "help", "copyright", "credits" or
           | "license" for more information.         >>> 2**1000         1
           | 0715086071862673209484250490600018105614048117055336074437503
           | 8837035105112493612249319837881569585812759467291755314682518
           | 7145285692314043598457757469857480393456777482423098542107460
           | 5062371141877954182153046474983581941267398767559165543946077
           | 062914571196477686542167660429831652624386837205668069376
           | >>> _/2**999         2.0
        
           | mpweiher wrote:
           | That was kind of par-for-the-course back then.
           | 
           | LISP had it, Smalltalk had it, Unix dc/bc had it.
        
       | ahartmetz wrote:
       | Interesting, seems like Python is a strict improvement over ABC
       | though many things are very similar. The PUT ... IN ... and
       | INSERT ... IN ... syntax looks quite clunky and un-composable, at
       | least the examples never do more than one (high-level) operation
       | per line. Also, I guess GvR's English wasn't that good at the
       | time - it should be have been INTO, right?
        
         | zahlman wrote:
         | "in" vs "into" is often just a matter of how casually you're
         | speaking.
         | 
         | The same sort of syntax was used in HyperTalk (with "into"):
         | https://en.wikipedia.org/wiki/HyperTalk#Description I wouldn't
         | be surprised to hear of it in AppleScript, either, although I
         | can't recall.
        
         | aebtebeten wrote:
         | not a strict improvement: didn't ABC have persistent variables?
        
       | zahlman wrote:
       | Extremely cool. Thanks, GvR.
       | 
       | For my own language design I've wanted to introduce some of this
       | ABC syntax back into Python. Mainly for unpacking data and doing
       | index/slice assignments; a lot of beginners seem to get tripped
       | up because assignments in Python use the same syntax as
       | mutations, so maybe it's better to write e.g. `a['b'] = c` like
       | `set b = c in a`, or `update a with {'b': c}`, or ... who knows,
       | exactly.
        
         | eru wrote:
         | I agree that Python would benefit from separating mutation and
         | assignment.
         | 
         | Especially when you are dealing with nested functions. You'd
         | get around the whole need for 'global' and 'nonlocal'
         | declarations. (Though your linter might still ask you for them
         | for clarity.)
         | 
         | As a minimal syntax change, I would propose using perhaps = for
         | introduction of a variable (the common case) and := for an
         | explicit mutation of an existing variable.
         | 
         | But you could also use `let . = ..` and `. = ..` like Rust
         | does.
        
       | perrohunter wrote:
       | Where is the GIL in this?
        
         | eru wrote:
         | You only need the GIL in the first place, when you are doing
         | multi-threading.
         | 
         | Python only got its own GIL in version 1.5 of CPython.
        
       | dec0dedab0de wrote:
       | The year says 91, but it looks like it was recently pushed to
       | github, which is a notable event on its own.
        
       | layer8 wrote:
       | The use of "HOW TO" for defining subroutines is kinda neat.
       | Though "HOW TO RETURN" for functions doesn't quite hit the mark.
       | "HOW TO OBTAIN" or "HOW TO SUPPLY" would work with the same
       | number of characters.
        
       | nurettin wrote:
       | It actually looks surprisingly usable
       | https://homepages.cwi.nl/~steven/abc/types.html
        
       | mg wrote:
       | The first example in the lanuage introduction
       | (https://homepages.cwi.nl/~steven/abc/):                  HOW TO
       | RETURN words document:           PUT {} IN collection
       | FOR line IN document:              FOR word IN split line:
       | IF word not.in collection:                    INSERT word IN
       | collection           RETURN collection
       | 
       | In Python it would be:                   def words(document):
       | collection = set()            for line in document:
       | for word in line.split():                  if word not in
       | collection:                     collection.add(word)
       | return collection
       | 
       | I kept the splitting by line and "if word not in collection:" in
       | there even though they don't have an impact on the outcome. I
       | have the feeling that even in the original example they have only
       | been put there to show the language constructs, not to do
       | anything useful. If one wanted to optimize it, it could all be
       | collapsed to just "return set(text.split())", but that would not
       | show off the language features.
       | 
       | ABC uses 225 chars, Python 218 chars. 3% less.
       | 
       | So one could say Python is 3% more efficient than ABC.
        
         | volemo wrote:
         | "HOW TO RETURN" for something as common as "def" is crazy!
        
           | mg wrote:
           | Well, not as bad as something like                   public
           | static function words(string $document): array {
           | 
           | which some languages these days are coming up with.
        
             | volemo wrote:
             | While I agree, at least here every word, though is verbose,
             | at least means something, whereas "HOW TO RETURN" carries
             | no more meaning than "def".
        
               | mg wrote:
               | As I understand it, "RETURN" means that the function will
               | return something. And that when you define a function
               | that returns nothing, but only does something, you just
               | use "HOW TO".
        
               | tim333 wrote:
               | I guess it's a shortening of "here's how to return the
               | words in a document".
               | 
               | I think def is good though. I guess with new fangled
               | prompt engineering you could use the english version.
        
               | amypetrik8 wrote:
               | > public static function words(string $document): array {
               | 
               | >, though is verbose, at least means something
               | 
               | I disagree, it is hardly verbose. there can be further
               | detailing of the input and return value of the function
               | beyond a simple type. Java didn't go far enough, not by a
               | long shot - we need hardcore painstaking, completely
               | brutal typing. Such typing will be highly beneficial for
               | software reliability - you're not against reliability are
               | you?
        
           | az09mugen wrote:
           | Reminds me if tabloid language, were the translation would be
           | :
           | 
           | DISCOVER HOW TO words WITH document
        
             | mg wrote:
             | DISCOVER THE SHOCKING TRUTH ABOUT HOW TO hello WITH name:
             | PRINT "hello " + name
        
               | tim333 wrote:
               | I think:                   DISCOVER THE SHOCKING TRUTH
               | ABOUT HOW TO hello WITH name:             YOU WON'T WANT
               | TO MISS "hello " + name
        
               | boutell wrote:
               | I love programming in listicle:
               | 
               | HERE ARE THE TOP 10 fibbonacci_numbers:
               | 
               | YOU WON'T BELIEVE n := 6
        
       | kristopolous wrote:
       | I swear I remember using this. I even remember the syntax. I was
       | able to compile it and just start writing in it. I have no idea
       | how I know this syntax.
       | 
       | Did early linux have this? Maybe netbsd?
       | 
       | I actually found it. It was on simtel:
       | https://archive.org/details/Simtel20_Sept92
       | 
       | I must have gotten it from there. I would routinely get any thing
       | Walnut Creek would make.
       | 
       | I also realized a couple years ago I could navigate EDLIN without
       | help and knew how to use masm. Somehow I had forgotten what I
       | know but my fingers did not.
        
         | teruakohatu wrote:
         | Can you tell me about "Simtel"? I have never used a BBS but
         | from looking at that ISO it was a collection of software
         | downloaded from BBS' ?
        
           | msla wrote:
           | FTP server, not BBS. You had to be on the Internet to access
           | it.
           | 
           | https://en.wikipedia.org/wiki/Simtel
           | 
           | It was called SIMTEL20 for a while because it was hosted on a
           | PDP-10 mainframe running the TOPS-20 operating system, but
           | apparently it was hosted on a PDP-10 running ITS first:
           | 
           | > The archive was hosted initially on the MIT-MC PDP-10
           | running the Incompatible Timesharing System,[1] then TOPS-20,
           | then FreeBSD servers
        
         | cbdevidal wrote:
         | Fun story: As a kid with only a DOS 3.3 box and no BBS to
         | download another and not much money to buy one, no magazine
         | subscription etc., I accidentally erased our word processor
         | software. I literally only had EDLIN for writing anything. So,
         | that's what I used. Got so good I was able to write multi-page
         | book reports with it.
        
         | mcv wrote:
         | I encountered it on an open day on the university. The only
         | thing I still remember is that functions were called HowTo,
         | because they described how to do something.
        
       | sureglymop wrote:
       | Wasn't python for a while just a REPL to query and call C
       | functions from shared objects with dlsym and probably an
       | equivalent to libffi?
       | 
       | Maybe I am remembering this wrong...
        
       | bobsh wrote:
       | There's even a book. I have it (and have had it for a loooong
       | time). I tried to do some larger things with ABC back in the day.
       | It was nice. Then Python arrived. I think I still have the
       | muscle-memory for the editor.
        
       ___________________________________________________________________
       (page generated 2025-11-29 23:01 UTC)