The title would probably be confusing, but I could not make it better than this. I noticed that most programming languages are limited to the alphanumerical set along with the special characters present in a general keyboard. I wondered if this posed a barrier for developers on what characters they were limited to program in, or if it was intentional from the start that these keys would be the most optimal characters for a program to be coded in by a human and was later adopted as a standard for every user. Basically, are the modern keyboards built around programming languages or are programming languages built around these keyboards?
C supports alternate ways of typing some of its punctuation, for programmers whose keyboards didn’t support them all. For example, if you can’t type
[ ]
you can use??( ??)
instead. (There are other ones that use angle brackets, but I can’t type them here because Lemmy escapes them incorrectly. Irony.)https://en.wikipedia.org/wiki/Digraphs_and_trigraphs#C
The usual example of a programming language using especially unusual characters is APL, where all built-in functions are all represented by single characters, mostly drawn from mathematical notations, Greek alphabet, and so on. For example,
⍋
is the “sort” function.From one of the many How to shoot yourself in the foot guides, for APL:
A fascinating language to look at, Conway’s Game of Life is simply
life ← {⊃1 ⍵ ∨.∧ 3 4 = +/ +⌿ ¯1 0 1 ∘.⊖ ¯1 0 1 ⌽¨ ⊂⍵}
, but I have zero interest in ever actually learning it ;)There are also keyboards with the proper symbols:
The core of that Life expression works by taking the array of cells and shifting it in the eight different directions, then summing those arrays to get the population counts.
I tried translating this into Python — but I’ve never written
numpy
code before, so this is probably less efficient than it could be. But it does work and you can see a glider move through a few generations.The array-shifting logic is in the
populations
function, withnp.roll
being the equivalent of the APL rotate operation (written as⌽
and⊖
in the original).import numpy as np def alive(popu, cell): return int(popu == 3 or (popu == 4 and cell)) alive = np.frompyfunc(alive, 2, 1) def populations(grid): return np.array( [ np.roll(r1, shift, 1) for shift in [-1, 0, 1] for r1 in (np.roll(grid, shift, 0) for shift in [-1, 0, 1]) ] ).sum(axis=0) def nextgen(grid): return alive(populations(grid), grid) grid = np.array([[0, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0], [0, 0, 0, 1, 0, 0], [0, 1, 1, 1, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]) for gens in range(5): print(grid) grid = nextgen(grid) print(grid)
Yeah, that looks closer to what I remember from university ;)