[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)