Files
ioccc/1991/brnstnd/sorta.README.md
Landon Curt Noll 7712db4a17 Expand all leading tabs in markdown files
Given how problematic leading tabs in markdown files can be,
we have expanded all leading tabs in markdown files by:

```sh
find * -type f -name '*.md' -print |
  while read -r file; do
    rm -f "$file.tmp" ;
    expand < "$file" > "$file.tmp" ;
    mv -f -v "$file.tmp" "$file" ;
  done
```

Given the previous changes to `bin/pandoc-wrapper.sh` and other recent
commits and recent pull requests, the were were **NO** changes to
any HTML files.  This is a **good thing** as the expression goes.

No there are no leading tabs in any markdown files.
A check to catch any re-introduction of leading tabs
into any markdown file is on the way.

BTW: We do not have anything against leading tabs in files,
even though we have had to deal with their impact on forming
HTML from markdown files (as well as the calc source code).
It is just that this is one of those cases where tabs conflict
(sometimes caused by people wanting to change the classic
8-space tab model) with a desired outcome.

Perform `make www` to perform the above and test under macOS.
2024-06-24 11:57:35 -07:00

6.4 KiB

The sorta scripts described below can sorta be found in this directory.

sorta.i2+2

    2 2+#`            [ about as basic as you can get ]ld

This script takes 2, adds 2 to it, and prints the result (with a newline). I get 5 on the hand-held Sinclair under ZYNIX. Let me know if your machine produces a different result so that I can send you patches.

sorta.iarg0

    0A`           [ take arg 0, print it ]

This is self-explanatory.

sorta.icalc

    [D2sD3s]:Dld        [ input m n, output m n m n ]ld

    [2*1=d]:cld         [ aux routine for :d recursion ]ld
    [1=D1s>1Ds_+=c]:dld [ input m n, as long as n <= m double it, output m n ]ld

    [D2s1s_+1s]:-ld     [ input m n, output m-n n ]ld
    [1=D1s>1Ds_+#T=-2/D=1]:1ld [ aux routine for :@ ]ld
    [1D=d2/1=1ddd1 ]:!ld
    ["0"Td]:0ld
    [DD=!1_+=0]:@ld     [ input m, m assumed nonnegative, append
                          binary representation of m to top of s stack ]ld

    ["-"T_]:+ld
    [D0 1s>=+1=@]:2ld   [ input m, append - to top of s stack if m is negative,
                          then append binary representation of abs(m) to
                          top of s stack ]ld

    [d1A:A2=A]:A 27182 a1>=A
    [d2A:A1=A]:A 3145 a2>=A

    D    # " in binary is "T 1=2 `ld
    1=Dd # " in binary is "T 1=2 `ld

    1=D  1s# " + "T 1s#T " is "T +  #Td `ld
    1=D  1s# " - "T 1s#T " is "T _+  #Td `ld
    1=D  1s# " * "T 1s#T " is "T *  #Td `ld
    1=D  1s# " / "T 1s#T " is "T /  #Td `ld
    1=D  1s# " % "T 1s#T " is "T 1=D/*_+  #Td `ld

    1=D    d  "~ "    #T " is "T D& #T$ld " (" 1=2 ")"T `ld
    1=D  1s# " & "T 1s#T " is "T &D&  #T$ld " (" 1=2 ")"T `ld
    1=D  1s# " | "T 1s#T " is "T D&1sD&&  #T$ld " (" 1=2 ")"T `ld
    1=D  1s# " ^ "T 1s#T " is "T 1=D&2sD&1sD&&&D&  #T$ld " (" 1=2 ")"T `ld

icalc shows off SORTA's understanding of integer arithmetic. You can run it with up to two arguments; the arguments have default values of 27182 and 3145. Notice that SORTA doesn't have a language primitive for converting a string to a number, yet icalc is performing arithmetic on its arguments. Can you see how? (Hint: Try ./sorta "2 2+" 3 < sorta.icalc. Look at program A.) icalc also provides a useful binary output routine, and if you can't remember offhand that D2sD3s&2sD&1sD&&&D& means XOR, you can just look it up here.

sorta.idup

    [ld#1_+1=y]:x
    [uD1+=x]:y
    0""1=y`

This script prints out the maximum file descriptor available from repeated dup(2)s---usually NOFILE - 1. Can you see how it works?

sorta.iecho

    [" "$ld]:sld                    [ print a space ]ld
    [1s1+DA$ld1s1_+D=sD=x]:xld      [ given n (argc-n), print args ]ld
    0a1_+D=x""`                     [ simulation of /bin/echo ]ld

This is a clone of /bin/echo, minus any argument processing and escape interpretation. (Note that, unlike some shells' echo, /bin/echo prints a newline even with no arguments.) Try ./sorta foo bar < iecho.

sorta.ifact1

    1#`ld2*#`ld3*#`ld4*#`ld5*#`ld6*#`ld7*#`ld8*#`ld9*#`ld10*#`ld

This is a very straightforward factorial program: Take 1, print it, multiply by 2, print it, multiply by 3, print it, etc.

sorta.ifact2

    [1+D2s*#`ld1s]:f
    1 0
    1=f 1=f 1=f 1=f 1=f 1=f 1=f 1=f 1=f 1=f

ifact1 does a lot of repeated work. ifact2 takes advantage of this by keeping the current n! n on the stack. Each call to routine f (1=f) increments n by 1 and prints out the factorial.

sorta.ifact3

    [1+D2s*#`ld1s]:f       [ given (n-1)! (n-1), print n!, put n! n ]
    [2s1=f2s1_+D0>=x]:x    [ given n n! x, print (n+1)! through (n+x)! ]
    0 1 10 1=x

Finally, ifact3 removes all the redundancy from ifact2, and exhibits proper documentation of stack routines. You can replace the 10 by anything in this version.

sorta.iio

    [ a simple example of interpreting code on the fly ]ld

    ["] "2 2+":xT ["]T " produces "T 1=x#T " which should be 4."T`

Notice that "2 2+" is a literal string inside the program.

sorta.irot13

    "[] [.tr] "
    ["]".[a-m][n-z][A-M][N-Z]"[" ]TTT ["]".[n-z][a-m][N-Z][A-M]"[" ]TTT
    "[tr] !q"T:xld
    ["rot13: fatal: need exactly one argument"`q]:gld
    ["rot13: fatal: cannot open "1ST`q]:hld
    a2_+=g
    1A 0 [ that 0 is for RDONLY ]ld
         0 'o D0 1s>=hld
    0Ou1=x  [ in a more complex spawner, this would be done under a fork ]ld

Despite its name, irot13 is meant to show how to exec a program with redirection from within sorta. You run it as ./sorta blah < irot13; it opens blah and runs a (BSD-style) tr command to rotate all letters by 13 spots. 1A 0 0 o opens argv[1]; the ' keeps the filename around for subroutine h to print a nice error message if necessary. 0Ou closes stdout and replaces it with the new descriptor. Finally, subroutine x executes the tr.

sorta.isleep

    ["" "+sleep" "+5" "sleep" !q]:S [F0>1_+=S]:s
    "forking sleep 5..."`ld
    1=s
    "waiting for sleep to finish..."`ld
    w
    "done, sleep exit code " #T`

This script illustrates the classic fork-exec-wait.

sorta.itailrec

    [3*#" "T$ldD=f]:f
    1=f

The sole purpose of this script is to prove that sorta can do infinite tail recursion (in this case, in program f). Do ./sorta < itailrec | more and watch the powers of 3 (mod your computer's word size) flow by.

sorta.iwhosort

    [0Ou "" "+-u" "sort" !q]:S [F0>1_+=S]:s
    [1Ou "" "+-u" "who"  !q]:W [F0>1_+=W]:w
    P1=wO1=sOww

This final example is a simple pipeline, who | sort.


Jump to: top