Position Independent Source Code

Hex Artifact Content
Login

Artifact d709f19f2ed7b52fd460e52414552eeacf62a67e:

Wiki page [PISC in Y Minutes] by yumaikas 2017-07-02 15:04:35.
0000: 44 20 32 30 31 37 2d 30 37 2d 30 32 54 31 35 3a  D 2017-07-02T15:
0010: 30 34 3a 33 35 2e 39 33 32 0a 4c 20 50 49 53 43  04:35.932.L PISC
0020: 5c 73 69 6e 5c 73 59 5c 73 4d 69 6e 75 74 65 73  \sin\sY\sMinutes
0030: 0a 50 20 33 38 39 34 38 31 65 66 33 37 35 31 34  .P 389481ef37514
0040: 34 36 63 36 63 61 38 31 30 31 38 62 64 35 64 34  46c6ca81018bd5d4
0050: 64 62 64 34 35 62 34 33 37 61 34 0a 55 20 79 75  dbd45b437a4.U yu
0060: 6d 61 69 6b 61 73 0a 57 20 36 30 33 32 0a 3c 6e  maikas.W 6032.<n
0070: 6f 77 69 6b 69 3e 0d 0a 0d 0a 3c 68 32 3e 20 50  owiki>....<h2> P
0080: 49 53 43 20 69 6e 20 59 20 6d 69 6e 75 74 65 73  ISC in Y minutes
0090: 20 3c 2f 68 32 3e 0d 0a 20 20 20 20 3c 70 72 65   </h2>..    <pre
00a0: 20 63 6c 61 73 73 3d 22 70 72 65 74 74 79 70 72   class="prettypr
00b0: 69 6e 74 22 3e 0d 0a 23 20 50 49 53 43 20 68 61  int">..# PISC ha
00c0: 73 20 32 20 74 79 70 65 73 20 6f 66 20 63 6f 6d  s 2 types of com
00d0: 6d 65 6e 74 73 3a 20 6c 69 6e 65 20 63 6f 6d 6d  ments: line comm
00e0: 65 6e 74 73 20 6c 69 6b 65 20 74 68 69 73 20 6f  ents like this o
00f0: 6e 65 2c 20 61 6e 64 0d 0a 2f 2a 0d 0a 42 6c 6f  ne, and../*..Blo
0100: 63 6b 20 63 6f 6d 6d 65 6e 74 73 20 6c 69 6b 65  ck comments like
0110: 20 74 68 69 73 2e 0d 0a 2a 2f 0d 0a 0d 0a 22 48   this...*/...."H
0120: 65 6c 6c 6f 2c 20 77 6f 72 6c 64 21 22 20 70 72  ello, world!" pr
0130: 69 6e 74 6c 6e 0d 0a 23 20 50 49 53 43 20 69 73  intln..# PISC is
0140: 20 61 20 73 74 61 63 6b 20 62 61 73 65 64 20 6c   a stack based l
0150: 61 6e 67 75 61 67 65 2c 20 77 68 69 63 68 20 6d  anguage, which m
0160: 65 61 6e 73 20 74 68 61 74 20 50 49 53 43 20 67  eans that PISC g
0170: 65 6e 65 72 61 6c 6c 79 20 0d 0a 23 20 77 6f 72  enerally ..# wor
0180: 6b 73 20 72 61 74 68 65 72 20 6c 69 6b 65 20 52  ks rather like R
0190: 65 76 65 72 73 65 20 50 6f 6c 69 73 68 20 4e 6f  everse Polish No
01a0: 74 61 74 69 6f 6e 20 28 52 50 4e 29 0d 0a 23 20  tation (RPN)..# 
01b0: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
01c0: 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 66 6f  the arguments fo
01d0: 72 20 61 20 63 6f 6d 6d 61 6e 64 20 63 6f 6d 65  r a command come
01e0: 20 62 65 66 6f 72 65 20 74 68 65 20 63 6f 6d 6d   before the comm
01f0: 61 6e 64 20 69 74 73 65 6c 66 2e 0d 0a 23 20 41  and itself...# A
0200: 6e 64 20 74 68 61 74 20 63 6f 6d 6d 61 6e 64 73  nd that commands
0210: 20 67 65 6e 65 72 61 6c 6c 79 20 72 75 6e 20 62   generally run b
0220: 61 63 6b 77 61 72 64 73 20 63 6f 6d 6d 70 61 72  ackwards commpar
0230: 65 64 20 74 6f 20 6d 6f 73 74 20 6c 61 6e 67 75  ed to most langu
0240: 61 67 65 73 0d 0a 0d 0a 23 20 53 6f 20 69 66 20  ages....# So if 
0250: 77 65 20 68 61 76 65 20 74 68 69 73 20 73 74 61  we have this sta
0260: 63 6b 2c 20 77 68 61 74 20 63 61 6e 20 77 65 20  ck, what can we 
0270: 64 6f 20 77 69 74 68 20 69 74 3f 0d 0a 31 20 32  do with it?..1 2
0280: 20 73 77 61 70 20 20 20 20 23 20 53 74 61 63 6b   swap    # Stack
0290: 3a 20 32 20 31 0d 0a 64 75 70 20 20 20 20 20 20  : 2 1..dup      
02a0: 20 20 20 23 20 53 74 61 63 6b 3a 20 32 20 31 20     # Stack: 2 1 
02b0: 31 20 0d 0a 64 72 6f 70 20 20 20 20 20 20 20 20  1 ..drop        
02c0: 23 20 53 74 61 63 6b 3a 20 32 20 31 20 0d 0a 32  # Stack: 2 1 ..2
02d0: 64 75 70 20 20 20 20 20 20 20 20 23 20 53 74 61  dup        # Sta
02e0: 63 6b 3a 20 32 20 31 20 32 20 31 0d 0a 6e 69 70  ck: 2 1 2 1..nip
02f0: 20 20 20 20 20 20 20 20 20 23 20 53 74 61 63 6b           # Stack
0300: 20 32 20 31 20 31 20 28 20 47 65 74 20 72 69 64   2 1 1 ( Get rid
0310: 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 29   of the second )
0320: 20 0d 0a 0d 0a 23 20 41 6e 64 20 77 65 27 6c 6c   ....# And we'll
0330: 20 63 6c 65 61 72 20 74 68 65 20 73 74 61 63 6b   clear the stack
0340: 20 66 6f 72 20 66 75 72 74 68 65 72 20 65 78 61   for further exa
0350: 6d 70 6c 65 73 0d 0a 64 72 6f 70 20 64 72 6f 70  mples..drop drop
0360: 20 64 72 6f 70 20 0d 0a 0d 0a 23 20 42 61 73 69   drop ....# Basi
0370: 63 20 6d 61 74 68 20 6c 6f 6f 6b 73 20 6c 69 6b  c math looks lik
0380: 65 20 74 68 69 73 3a 0d 0a 31 20 32 20 2b 20 23  e this:..1 2 + #
0390: 20 53 74 61 63 6b 3a 20 33 0d 0a 23 20 49 66 20   Stack: 3..# If 
03a0: 79 6f 75 27 72 65 20 72 75 6e 6e 69 6e 67 20 50  you're running P
03b0: 49 53 43 20 6f 6e 20 79 6f 75 72 20 6c 6f 63 61  ISC on your loca
03c0: 6c 20 6d 61 63 68 69 6e 65 2c 20 79 6f 75 27 6c  l machine, you'l
03d0: 6c 20 6e 6f 74 69 63 65 20 74 68 61 74 20 61 66  l notice that af
03e0: 74 65 72 20 65 61 63 68 20 0d 0a 23 20 6c 69 6e  ter each ..# lin
03f0: 65 20 6f 66 20 69 6e 70 75 74 2c 20 69 74 20 73  e of input, it s
0400: 68 6f 77 73 20 79 6f 75 20 74 68 65 20 73 74 61  hows you the sta
0410: 63 6b 2c 20 61 6e 64 20 74 68 65 20 74 79 70 65  ck, and the type
0420: 73 20 6f 66 20 74 68 65 20 76 61 72 69 61 62 6c  s of the variabl
0430: 65 73 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  es on the stack.
0440: 0d 0a 0d 0a 64 72 6f 70 20 20 20 20 20 20 20 20  ....drop        
0450: 23 20 57 65 27 72 65 20 64 6f 6e 65 20 77 69 74  # We're done wit
0460: 68 20 74 68 61 74 20 33 20 66 6f 72 20 6e 6f 77  h that 3 for now
0470: 2e 0d 0a 0d 0a 0d 0a 23 20 50 49 53 43 20 63 75  .......# PISC cu
0480: 72 72 65 6e 74 6c 79 20 68 61 73 20 74 77 6f 20  rrently has two 
0490: 74 79 70 65 73 20 6f 66 20 6e 75 6d 62 65 72 73  types of numbers
04a0: 3a 20 49 6e 74 65 67 65 72 73 20 61 6e 64 20 44  : Integers and D
04b0: 6f 75 62 6c 65 20 50 72 65 63 69 73 69 6f 6e 20  ouble Precision 
04c0: 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 6e  floating point n
04d0: 75 6d 62 65 72 73 2e 0d 0a 31 20 32 2e 30 20 2b  umbers...1 2.0 +
04e0: 20 20 20 20 20 23 20 33 20 3c 44 6f 75 62 6c 65       # 3 <Double
04f0: 3e 0d 0a 23 20 41 6e 64 20 77 68 65 6e 20 61 20  >..# And when a 
0500: 44 6f 75 62 6c 65 20 61 6e 64 20 69 6e 74 20 6d  Double and int m
0510: 69 78 2c 20 74 68 65 20 69 6e 74 20 69 73 20 63  ix, the int is c
0520: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20  onverted into a 
0530: 64 6f 75 62 6c 65 0d 0a 33 2e 32 20 2a 20 20 20  double..3.2 *   
0540: 20 20 20 20 23 20 39 2e 36 30 30 30 30 30 30 30      # 9.60000000
0550: 30 30 30 30 30 30 31 20 3c 44 6f 75 62 6c 65 3e  0000001 <Double>
0560: 0d 0a 64 72 6f 70 0d 0a 0d 0a 0d 0a 23 20 42 6f  ..drop......# Bo
0570: 6f 6c 65 61 6e 73 20 61 72 65 20 61 6c 73 6f 20  oleans are also 
0580: 68 61 6e 64 6c 65 64 20 69 6e 20 61 6e 20 52 50  handled in an RP
0590: 4e 20 66 61 73 68 69 6f 6e 2c 20 74 72 75 65 20  N fashion, true 
05a0: 61 6e 64 20 66 61 6c 73 65 20 61 72 65 20 72 65  and false are re
05b0: 70 72 65 73 65 6e 74 65 64 20 62 79 20 60 74 60  presented by `t`
05c0: 20 61 6e 64 20 60 66 60 0d 0a 74 20 66 20 61 6e   and `f`..t f an
05d0: 64 20 20 20 20 20 23 20 66 20 3c 42 6f 6f 6c 65  d     # f <Boole
05e0: 61 6e 3e 0d 0a 74 20 6f 72 20 20 20 20 20 20 20  an>..t or       
05f0: 20 23 20 74 20 3c 42 6f 6f 6c 65 61 6e 3e 20 4e   # t <Boolean> N
0600: 6f 20 73 75 72 70 72 69 73 65 73 20 68 65 72 65  o surprises here
0610: 0d 0a 0d 0a 23 20 63 6c 65 61 72 2d 73 74 61 63  ....# clear-stac
0620: 6b 20 77 69 6c 6c 20 67 65 74 20 72 69 64 20 6f  k will get rid o
0630: 66 20 61 6e 79 74 68 69 6e 67 20 6c 65 66 74 20  f anything left 
0640: 6f 6e 20 74 68 65 20 73 74 61 63 6b 0d 0a 63 6c  on the stack..cl
0650: 65 61 72 2d 73 74 61 63 6b 0d 0a 0d 0a 23 20 49  ear-stack....# I
0660: 6e 20 50 49 53 43 2c 20 73 69 6e 63 65 20 61 6c  n PISC, since al
0670: 6c 20 77 6f 72 64 73 20 74 61 6b 65 20 61 72 67  l words take arg
0680: 75 6d 65 6e 74 73 20 6f 66 66 20 74 68 65 20 73  uments off the s
0690: 74 61 63 6b 2c 20 0d 0a 23 20 63 6f 6e 74 72 6f  tack, ..# contro
06a0: 6c 20 66 6c 6f 77 20 74 65 6e 64 73 20 74 6f 20  l flow tends to 
06b0: 77 6f 72 6b 20 69 6e 20 61 20 62 69 74 20 6f 66  work in a bit of
06c0: 20 61 20 62 61 63 6b 77 61 72 64 73 20 77 61 79   a backwards way
06d0: 0d 0a 0d 0a 23 20 54 68 69 73 20 69 73 20 61 6e  ....# This is an
06e0: 20 69 66 20 73 74 61 74 65 6d 65 6e 74 2e 0d 0a   if statement...
06f0: 23 20 74 68 65 20 62 69 74 73 20 77 69 74 68 20  # the bits with 
0700: 60 5b 60 20 61 6e 64 20 60 5d 60 20 61 72 65 20  `[` and `]` are 
0710: 63 61 6c 6c 65 64 20 71 75 6f 74 61 74 69 6f 6e  called quotation
0720: 73 2c 20 61 6e 64 20 74 68 65 79 20 61 72 65 20  s, and they are 
0730: 6b 69 6e 64 61 20 73 70 65 63 69 61 6c 20 0d 0a  kinda special ..
0740: 23 20 54 68 69 73 20 70 75 74 73 20 61 20 62 6f  # This puts a bo
0750: 6f 6c 65 61 6e 20 76 61 6c 75 65 20 61 6e 64 20  olean value and 
0760: 32 20 71 75 6f 74 61 74 69 6f 6e 73 20 6f 6e 20  2 quotations on 
0770: 74 68 65 20 73 74 61 63 6b 2c 20 61 6e 64 20 74  the stack, and t
0780: 68 65 20 63 68 65 63 6b 73 20 74 68 65 20 0d 0a  he checks the ..
0790: 23 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 76 61  # the boolean va
07a0: 6c 75 65 20 74 6f 20 64 65 63 69 64 65 20 77 68  lue to decide wh
07b0: 69 63 68 20 71 75 6f 74 61 74 69 6f 6e 20 74 6f  ich quotation to
07c0: 20 65 78 65 63 75 74 65 0d 0a 74 20 5b 20 22 74   execute..t [ "t
07d0: 72 75 65 22 20 70 72 69 6e 74 6c 6e 20 5d 20 5b  rue" println ] [
07e0: 20 22 66 61 6c 73 65 22 20 70 72 69 6e 74 6c 6e   "false" println
07f0: 20 5d 20 69 66 20 20 20 0d 0a 0d 0a 23 20 4e 6f   ] if   ....# No
0800: 74 65 20 61 6c 73 6f 20 74 68 61 74 20 79 6f 75  te also that you
0810: 20 63 61 6e 20 75 73 65 20 74 68 65 20 73 74 61   can use the sta
0820: 63 6b 20 74 6f 20 73 65 6e 64 20 0d 0a 23 20 49  ck to send ..# I
0830: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61 6e  nformation to an
0840: 6f 74 68 65 72 20 63 6f 6d 6d 61 6e 64 0d 0a 23  other command..#
0850: 20 54 68 69 73 20 77 69 6c 6c 20 70 72 69 6e 74   This will print
0860: 20 22 44 69 66 66 65 72 65 6e 74 22 0d 0a 32 20   "Different"..2 
0870: 31 20 3d 20 5b 20 22 54 68 65 20 73 61 6d 65 22  1 = [ "The same"
0880: 20 5d 20 5b 20 22 44 69 66 66 65 72 65 6e 74 22   ] [ "Different"
0890: 20 5d 20 69 66 20 70 72 69 6e 74 6c 6e 0d 0a 0d   ] if println...
08a0: 0a 23 20 54 68 65 79 20 61 72 65 20 68 6f 77 20  .# They are how 
08b0: 79 6f 75 20 70 61 73 73 20 63 6f 64 65 20 74 6f  you pass code to
08c0: 20 77 6f 72 64 73 20 74 68 61 74 20 63 61 6e 20   words that can 
08d0: 62 65 20 65 78 65 63 75 74 65 64 20 61 74 20 61  be executed at a
08e0: 20 6c 61 74 65 72 20 74 69 6d 65 0d 0a 23 20 49   later time..# I
08f0: 66 20 79 6f 75 20 77 61 6e 74 20 74 6f 20 65 78  f you want to ex
0900: 65 63 75 74 65 20 61 20 71 75 6f 74 61 74 69 6f  ecute a quotatio
0910: 6e 2c 20 79 6f 75 20 75 73 65 20 74 68 65 20 60  n, you use the `
0920: 63 61 6c 6c 60 20 77 6f 72 64 0d 0a 5b 20 22 54  call` word..[ "T
0930: 68 69 73 20 69 73 20 61 20 71 75 6f 74 61 74 69  his is a quotati
0940: 6f 6e 22 20 5d 20 5b 20 22 42 75 74 20 74 68 69  on" ] [ "But thi
0950: 73 20 69 73 20 74 68 65 20 6f 6e 65 20 74 68 61  s is the one tha
0960: 74 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  t will be called
0970: 22 20 5d 20 63 61 6c 6c 0d 0a 0d 0a 23 20 51 75  " ] call....# Qu
0980: 6f 74 61 74 69 6f 6e 73 20 6c 69 76 65 20 6f 6e  otations live on
0990: 20 74 68 65 20 73 74 61 63 6b 20 62 65 66 6f 72   the stack befor
09a0: 65 20 74 68 65 79 20 61 72 65 20 75 73 65 64 2c  e they are used,
09b0: 20 73 6f 20 79 6f 75 27 6c 6c 20 73 65 65 6d 20   so you'll seem 
09c0: 74 68 65 6d 20 70 72 69 6e 74 65 64 20 6f 75 74  them printed out
09d0: 0d 0a 23 20 46 6f 72 20 65 78 61 6d 70 6c 65 20  ..# For example 
09e0: 79 6f 75 20 63 6f 75 6c 64 20 74 79 70 65 20 74  you could type t
09f0: 68 65 20 61 62 6f 76 65 20 65 78 61 6d 70 6c 65  he above example
0a00: 20 69 6e 20 74 68 69 73 20 66 61 73 68 69 6f 6e   in this fashion
0a10: 3a 0d 0a 5b 20 22 54 68 69 73 20 69 73 20 61 20  :..[ "This is a 
0a20: 71 75 6f 74 61 74 69 6f 6e 22 20 5d 20 0d 0a 5b  quotation" ] ..[
0a30: 20 22 42 75 74 20 74 68 69 73 20 69 73 20 74 68   "But this is th
0a40: 65 20 6f 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  e one that will 
0a50: 62 65 20 63 61 6c 6c 65 64 22 20 5d 20 63 61 6c  be called" ] cal
0a60: 6c 0d 0a 23 20 41 6e 64 20 69 66 20 79 6f 75 20  l..# And if you 
0a70: 64 6f 20 74 68 61 74 2c 20 79 6f 75 27 6c 6c 20  do that, you'll 
0a80: 73 65 65 20 74 68 65 20 73 74 61 63 6b 20 67 65  see the stack ge
0a90: 74 20 62 75 69 6c 74 20 75 70 20 66 6f 72 20 65  t built up for e
0aa0: 61 63 68 20 71 75 6f 74 61 74 69 6f 6e 2e 20 0d  ach quotation. .
0ab0: 0a 63 6c 65 61 72 2d 73 74 61 63 6b 0d 0a 0d 0a  .clear-stack....
0ac0: 23 20 4e 6f 77 20 74 68 61 74 20 77 65 20 68 61  # Now that we ha
0ad0: 76 65 20 71 75 6f 61 74 69 6f 6e 73 20 61 20 6c  ve quoations a l
0ae0: 69 74 74 6c 65 20 65 78 70 6c 61 69 6e 65 64 20  ittle explained 
0af0: 77 65 20 63 61 6e 20 63 6f 76 65 72 20 76 65 63  we can cover vec
0b00: 74 6f 72 73 2c 20 77 68 69 63 68 20 61 72 65 20  tors, which are 
0b10: 50 49 53 43 27 73 20 61 72 72 61 79 2d 6c 69 6b  PISC's array-lik
0b20: 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 73 0d 0a 23  e collections..#
0b30: 20 54 68 65 20 62 61 73 69 63 20 73 79 6e 74 61   The basic synta
0b40: 78 20 66 6f 72 20 74 68 65 6d 20 69 73 3a 0d 0a  x for them is:..
0b50: 7b 20 31 20 32 20 33 20 7d 20 20 20 20 20 20 20  { 1 2 3 }       
0b60: 23 20 53 74 61 63 6b 3a 20 5b 31 20 32 20 33 5d  # Stack: [1 2 3]
0b70: 20 3c 56 65 63 74 6f 72 3e 0d 0a 64 75 70 20 30   <Vector>..dup 0
0b80: 20 76 65 63 2d 61 74 20 20 20 20 23 20 73 74 61   vec-at    # sta
0b90: 63 6b 3a 20 5b 31 20 32 20 33 5d 20 3c 56 65 63  ck: [1 2 3] <Vec
0ba0: 74 6f 72 3e 2c 20 31 20 3c 49 6e 74 65 67 65 72  tor>, 1 <Integer
0bb0: 3e 0d 0a 0d 0a 23 20 4f 6e 65 20 74 68 69 6e 67  >....# One thing
0bc0: 20 74 6f 20 6e 6f 74 65 20 61 62 6f 75 74 20 7b   to note about {
0bd0: 20 7d 20 73 79 6e 74 61 78 20 66 6f 72 20 76 65   } syntax for ve
0be0: 63 74 6f 72 73 20 69 73 20 74 68 61 74 20 74 68  ctors is that th
0bf0: 65 20 77 6f 72 64 73 20 69 6e 73 69 64 65 20 74  e words inside t
0c00: 68 65 20 7b 20 7d 20 61 72 65 20 74 72 65 61 74  he { } are treat
0c10: 65 64 20 61 73 20 63 6f 64 65 0d 0a 23 20 53 75  ed as code..# Su
0c20: 63 68 20 74 68 61 74 20 74 68 65 20 77 6f 72 64  ch that the word
0c30: 73 20 61 72 65 20 65 78 65 63 75 74 65 64 2c 20  s are executed, 
0c40: 61 6e 64 20 74 68 65 6e 20 61 6e 79 74 68 69 6e  and then anythin
0c50: 67 20 74 68 65 79 20 70 75 74 20 6f 6e 20 74 68  g they put on th
0c60: 65 20 73 74 61 63 6b 20 69 73 20 73 6c 69 63 65  e stack is slice
0c70: 64 20 69 6e 74 6f 20 76 65 63 74 6f 72 2e 0d 0a  d into vector...
0c80: 7b 20 31 30 20 5b 20 31 20 5d 20 74 69 6d 65 73  { 10 [ 1 ] times
0c90: 20 7d 0d 0a 23 20 53 74 61 63 6b 3a 20 5b 31 20   }..# Stack: [1 
0ca0: 31 20 31 20 31 20 31 20 31 20 31 20 31 20 31 20  1 1 1 1 1 1 1 1 
0cb0: 31 5d 20 3c 56 65 63 74 6f 72 3e 0d 0a 0d 0a 0d  1] <Vector>.....
0cc0: 0a 23 20 54 68 6f 73 65 20 61 72 65 20 73 6f 6d  .# Those are som
0cd0: 65 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20 73  e of the stack s
0ce0: 68 75 66 66 6c 65 72 73 2e 20 49 66 20 79 6f 75  hufflers. If you
0cf0: 20 77 61 6e 74 20 74 6f 20 62 75 69 6c 64 20 79   want to build y
0d00: 6f 75 72 20 6f 77 6e 20 73 74 61 63 6b 20 73 68  our own stack sh
0d10: 75 66 66 6c 65 72 73 0d 0a 23 20 72 75 6e 20 60  ufflers..# run `
0d20: 22 70 69 63 6b 22 20 68 65 6c 70 60 20 74 6f 20  "pick" help` to 
0d30: 6c 6f 6f 6b 20 61 74 20 68 6f 77 20 6d 79 20 63  look at how my c
0d40: 75 72 72 65 6e 74 20 73 65 74 20 69 73 20 62 75  urrent set is bu
0d50: 69 6c 74 2e 0d 0a 0d 0a 23 20 54 68 6f 75 67 68  ilt.....# Though
0d60: 20 73 6f 6d 65 20 73 74 61 63 6b 2d 62 61 73 65   some stack-base
0d70: 64 20 6c 61 6e 67 75 61 67 65 73 20 6d 61 6b 65  d languages make
0d80: 20 74 68 65 6d 20 68 61 72 64 20 74 6f 20 75 73   them hard to us
0d90: 65 2c 20 50 49 53 43 20 68 61 73 20 64 65 63 65  e, PISC has dece
0da0: 6e 74 6c 79 20 66 75 6c 6c 79 20 66 65 61 74 75  ntly fully featu
0db0: 72 65 64 20 6c 6f 63 61 6c 20 76 61 72 69 61 62  red local variab
0dc0: 6c 65 73 0d 0a 23 20 73 6f 20 74 68 61 74 20 79  les..# so that y
0dd0: 6f 75 20 64 6f 6e 27 74 20 68 61 76 65 20 74 6f  ou don't have to
0de0: 20 74 72 61 63 6b 20 77 61 79 20 74 6f 6f 20 6d   track way too m
0df0: 61 6e 79 20 73 74 61 63 6b 20 65 6e 74 72 69 65  any stack entrie
0e00: 73 20 69 6e 20 79 6f 75 72 20 68 65 61 64 20 77  s in your head w
0e10: 68 65 6e 20 64 65 61 6c 69 6e 67 20 77 69 74 68  hen dealing with
0e20: 20 6c 61 72 67 65 72 20 63 6f 64 65 2e 0d 0a 23   larger code...#
0e30: 20 59 6f 75 20 75 73 65 20 60 3a 76 61 72 6e 61   You use `:varna
0e40: 6d 65 60 20 74 6f 20 74 61 6b 65 20 31 20 76 61  me` to take 1 va
0e50: 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 74 61  lue from the sta
0e60: 63 6b 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20  ck and store it 
0e70: 69 6e 20 61 20 6c 6f 63 61 6c 20 76 61 72 69 61  in a local varia
0e80: 62 6c 65 2e 20 20 0d 0a 22 79 75 6d 61 69 6b 61  ble.  .."yumaika
0e90: 73 22 20 3a 6e 61 6d 65 20 33 20 3a 6e 75 6d 0d  s" :name 3 :num.
0ea0: 0a 23 20 49 73 20 74 68 65 20 73 61 6d 65 20 61  .# Is the same a
0eb0: 73 3a 0d 0a 22 79 75 6d 61 69 6b 61 73 22 20 33  s:.."yumaikas" 3
0ec0: 20 3a 6e 75 6d 20 3a 6e 61 6d 65 0d 0a 23 20 54   :num :name..# T
0ed0: 68 6f 75 67 68 20 49 20 64 6f 20 6e 6f 74 20 72  hough I do not r
0ee0: 65 63 6f 6d 6d 65 6e 64 20 75 73 69 6e 67 20 74  ecommend using t
0ef0: 68 65 20 73 65 63 6f 6e 64 20 73 74 79 6c 65 0d  he second style.
0f00: 0a 0d 0a 23 20 24 76 61 72 6e 61 6d 65 20 70 6c  ...# $varname pl
0f10: 61 63 65 73 20 74 68 65 20 76 61 6c 75 65 20 66  aces the value f
0f20: 72 6f 6d 20 76 61 72 6e 61 6d 65 20 6f 6e 74 6f  rom varname onto
0f30: 20 74 68 65 20 73 74 61 63 6b 0d 0a 24 6e 61 6d   the stack..$nam
0f40: 65 20 70 72 69 6e 74 6c 6e 20 20 20 20 20 23 20  e println     # 
0f50: 50 72 69 6e 74 73 20 22 79 75 6d 61 69 6b 61 73  Prints "yumaikas
0f60: 22 0d 0a 0d 0a 7b 20 24 6e 61 6d 65 20 24 6e 75  "....{ $name $nu
0f70: 6d 20 7d 20 20 23 20 53 74 61 63 6b 3a 20 5b 79  m }  # Stack: [y
0f80: 75 6d 61 69 6b 61 73 20 33 5d 20 3c 56 65 63 74  umaikas 3] <Vect
0f90: 6f 72 3e 0d 0a 63 6c 65 61 72 2d 73 74 61 63 6b  or>..clear-stack
0fa0: 0d 0a 0d 0a 0d 0a 23 20 54 68 65 72 65 20 61 72  ......# There ar
0fb0: 65 20 72 6f 75 67 68 6c 79 20 74 77 6f 20 77 61  e roughly two wa
0fc0: 79 73 20 74 6f 20 64 65 66 69 6e 65 20 77 6f 72  ys to define wor
0fd0: 64 73 20 28 77 68 61 74 20 6d 6f 73 74 20 6c 61  ds (what most la
0fe0: 6e 67 61 75 67 65 73 20 63 61 6c 6c 20 66 75 6e  ngauges call fun
0ff0: 63 74 69 6f 6e 73 29 20 69 6e 20 50 49 53 43 3a  ctions) in PISC:
1000: 0d 0a 23 20 54 68 65 20 6d 6f 73 74 20 62 61 6e  ..# The most ban
1010: 67 2f 62 75 63 6b 20 69 73 20 74 6f 20 75 73 65  g/buck is to use
1020: 20 61 20 60 3a 60 20 60 3b 60 20 63 6f 6d 62 6f   a `:` `;` combo
1030: 0d 0a 23 20 57 6f 72 64 73 20 64 65 66 69 6e 65  ..# Words define
1040: 64 20 74 68 69 73 20 77 61 79 20 68 61 76 65 20  d this way have 
1050: 74 68 65 20 72 6f 75 67 68 20 73 79 6e 74 61 78  the rough syntax
1060: 20 6f 66 20 60 3a 20 6e 61 6d 65 20 28 20 69 6e   of `: name ( in
1070: 76 61 6c 73 20 2d 2d 20 6f 75 74 76 61 6c 73 20  vals -- outvals 
1080: 29 20 20 64 65 66 69 6e 69 74 69 6f 6e 20 3b 60  )  definition ;`
1090: 0d 0a 23 20 59 6f 75 20 6e 65 65 64 20 65 76 65  ..# You need eve
10a0: 72 79 20 70 61 72 74 2c 20 74 68 6f 75 67 68 20  ry part, though 
10b0: 74 68 65 20 73 74 61 63 6b 20 65 66 66 65 63 74  the stack effect
10c0: 20 63 6f 6d 6d 65 6e 74 20 28 46 72 6f 6d 20 60   comment (From `
10d0: 28 60 20 74 6f 20 60 29 60 29 20 69 73 6e 27 74  (` to `)`) isn't
10e0: 20 63 75 72 72 65 6e 74 6c 79 20 63 68 65 63 6b   currently check
10f0: 65 64 2e 0d 0a 3a 20 73 75 6d 2d 76 65 63 20 28  ed...: sum-vec (
1100: 20 76 65 63 74 6f 72 20 2d 2d 20 72 65 73 75 6c   vector -- resul
1110: 74 20 29 20 30 20 73 77 61 70 20 5b 20 2b 20 5d  t ) 0 swap [ + ]
1120: 20 76 65 63 2d 65 61 63 68 20 3b 0d 0a 0d 0a 23   vec-each ;....#
1130: 20 45 61 63 68 20 74 69 6d 65 20 79 6f 75 20 64   Each time you d
1140: 65 66 69 6e 65 20 61 20 77 6f 72 64 20 6c 69 6b  efine a word lik
1150: 65 20 74 68 69 73 2c 20 69 74 20 72 65 63 69 65  e this, it recie
1160: 76 65 73 20 69 74 73 20 6f 77 6e 20 6c 6f 63 61  ves its own loca
1170: 6c 73 20 66 72 61 6d 65 2e 0d 0a 23 20 28 57 68  ls frame...# (Wh
1180: 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 20 69  ich means that i
1190: 74 20 68 61 73 20 69 74 27 73 20 6f 77 6e 20 73  t has it's own s
11a0: 65 74 20 6f 66 20 6c 6f 63 61 6c 20 76 61 72 69  et of local vari
11b0: 61 62 6c 65 73 29 20 0d 0a 0d 0a 23 20 54 68 69  ables) ....# Thi
11c0: 73 20 64 6f 65 73 6e 27 74 20 61 70 70 6c 79 20  s doesn't apply 
11d0: 74 6f 20 74 68 65 20 73 65 63 6f 6e 64 20 77 61  to the second wa
11e0: 79 20 74 6f 20 64 65 66 69 6e 65 20 61 20 77 6f  y to define a wo
11f0: 72 64 3a 0d 0a 5b 20 30 20 73 77 61 70 20 5b 20  rd:..[ 0 swap [ 
1200: 2b 20 5d 20 76 65 63 2d 65 61 63 68 20 5d 20 3a  + ] vec-each ] :
1210: 73 75 6d 2d 76 65 63 0d 0a 23 20 49 66 20 61 20  sum-vec..# If a 
1220: 71 75 6f 74 61 74 69 6f 6e 20 69 73 20 73 74 6f  quotation is sto
1230: 72 65 64 20 69 6e 74 6f 20 61 20 6c 6f 63 61 6c  red into a local
1240: 20 76 61 72 69 61 62 6c 65 2c 20 0d 0a 23 20 79   variable, ..# y
1250: 6f 75 20 63 61 6e 20 6e 6f 77 20 75 73 65 20 74  ou can now use t
1260: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6c  he name of the l
1270: 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 20 61 73  ocal variable as
1280: 20 61 20 77 6f 72 64 0d 0a 7b 20 31 20 32 20 33   a word..{ 1 2 3
1290: 20 34 20 7d 20 73 75 6d 2d 76 65 63 0d 0a 23 20   4 } sum-vec..# 
12a0: 53 74 61 63 6b 3a 20 31 30 20 3c 49 6e 74 65 67  Stack: 10 <Integ
12b0: 65 72 3e 0d 0a 0d 0a 23 20 4c 6f 6f 70 73 0d 0a  er>....# Loops..
12c0: 23 20 52 69 67 68 74 20 6e 6f 77 20 50 49 53 43  # Right now PISC
12d0: 20 68 61 73 20 33 20 6d 61 69 6e 20 74 79 70 65   has 3 main type
12e0: 73 20 6f 66 20 6c 6f 6f 70 73 0d 0a 23 20 31 29  s of loops..# 1)
12f0: 20 43 6f 75 6e 74 65 64 20 6c 6f 6f 70 73 20 62   Counted loops b
1300: 61 73 65 64 20 6f 6e 20 74 68 65 20 60 74 69 6d  ased on the `tim
1310: 65 73 60 20 77 6f 72 64 0d 0a 30 20 3a 69 0d 0a  es` word..0 :i..
1320: 34 20 5b 20 24 69 20 70 72 69 6e 74 20 2b 2b 69  4 [ $i print ++i
1330: 20 5d 20 74 69 6d 65 73 0d 0a 23 20 54 68 69 73   ] times..# This
1340: 20 70 72 69 6e 74 73 20 0d 0a 23 20 30 0d 0a 23   prints ..# 0..#
1350: 20 31 20 0d 0a 23 20 32 0d 0a 23 20 33 0d 0a 0d   1 ..# 2..# 3...
1360: 0a 23 20 32 29 20 43 6f 6e 64 69 74 69 6f 6e 20  .# 2) Condition 
1370: 62 61 73 65 64 20 6c 6f 6f 70 73 2c 20 75 73 69  based loops, usi
1380: 6e 67 20 74 68 65 20 60 77 68 69 6c 65 60 20 77  ng the `while` w
1390: 6f 72 64 0d 0a 5b 20 24 69 20 30 20 3d 20 6e 6f  ord..[ $i 0 = no
13a0: 74 20 5d 20 5b 20 24 69 20 70 72 69 6e 74 20 2d  t ] [ $i print -
13b0: 2d 69 20 5d 20 77 68 69 6c 65 0d 0a 23 20 50 72  -i ] while..# Pr
13c0: 69 6e 74 73 3a 0d 0a 23 20 34 0d 0a 23 20 33 0d  ints:..# 4..# 3.
13d0: 0a 23 20 32 0d 0a 23 20 31 20 0d 0a 0d 0a 0d 0a  .# 2..# 1 ......
13e0: 23 20 33 29 20 45 61 63 68 20 63 6f 6c 6c 65 63  # 3) Each collec
13f0: 74 69 6f 6e 20 74 79 70 65 2c 20 56 65 63 74 6f  tion type, Vecto
1400: 72 73 2c 20 44 69 63 74 69 6f 6e 61 72 69 65 73  rs, Dictionaries
1410: 20 61 6e 64 20 53 74 72 69 6e 67 73 20 63 75 72   and Strings cur
1420: 72 65 6e 74 6c 79 20 73 65 76 65 72 61 6c 20 77  rently several w
1430: 6f 72 64 73 20 74 68 61 74 20 69 74 65 72 61 74  ords that iterat
1440: 65 20 6f 76 65 72 20 74 68 65 6d 0d 0a 7b 20 31  e over them..{ 1
1450: 20 32 20 33 20 34 20 7d 20 5b 20 70 72 69 6e 74   2 3 4 } [ print
1460: 6c 6e 20 5d 20 76 65 63 2d 65 61 63 68 20 0d 0a  ln ] vec-each ..
1470: 23 20 50 72 69 6e 74 73 0d 0a 23 20 31 0d 0a 23  # Prints..# 1..#
1480: 20 32 0d 0a 23 20 33 0d 0a 23 20 34 0d 0a 0d 0a   2..# 3..# 4....
1490: 22 61 62 63 64 22 20 5b 20 70 72 69 6e 74 6c 6e  "abcd" [ println
14a0: 20 5d 20 65 61 63 68 2d 63 68 61 72 20 0d 0a 2f   ] each-char ../
14b0: 2a 20 50 72 69 6e 74 73 20 0d 0a 61 0d 0a 62 0d  * Prints ..a..b.
14c0: 0a 63 0d 0a 64 0d 0a 2a 2f 0d 0a 0d 0a 23 20 44  .c..d..*/....# D
14d0: 69 63 74 69 6f 6e 61 72 69 65 73 20 75 73 65 20  ictionaries use 
14e0: 73 74 72 69 6e 67 73 20 66 6f 72 20 6b 65 79 73  strings for keys
14f0: 2c 20 61 6e 64 20 61 6e 79 74 68 69 6e 67 20 66  , and anything f
1500: 6f 72 20 76 61 6c 75 65 73 0d 0a 3c 64 69 63 74  or values..<dict
1510: 3e 20 64 75 70 20 3a 66 75 6e 6e 79 4e 75 6d 62  > dup :funnyNumb
1520: 65 72 73 0d 0a 20 20 20 20 23 20 76 61 6c 75 65  ers..    # value
1530: 20 3c 3c 2d 6b 65 79 0d 0a 20 20 20 20 23 20 3c   <<-key..    # <
1540: 3c 2d 20 74 61 6b 65 73 20 74 68 65 20 76 61 6c  <- takes the val
1550: 75 65 2c 20 73 74 6f 72 65 73 20 69 74 20 61 74  ue, stores it at
1560: 20 22 6b 65 79 22 20 69 6e 20 74 68 65 20 64 69   "key" in the di
1570: 63 74 2c 20 61 6e 64 20 6c 65 61 76 65 73 20 74  ct, and leaves t
1580: 68 65 20 64 69 63 74 20 6f 6e 20 74 68 65 20 73  he dict on the s
1590: 74 61 63 6b 0d 0a 20 20 20 20 22 34 32 22 20 3c  tack..    "42" <
15a0: 3c 2d 61 6e 73 77 65 72 74 6f 6c 69 66 65 0d 0a  <-answertolife..
15b0: 20 20 20 20 22 31 33 33 37 22 20 3c 3c 2d 6c 65      "1337" <<-le
15c0: 65 74 20 0d 0a 20 20 20 20 23 20 3c 2d 20 77 6f  et ..    # <- wo
15d0: 72 6b 73 20 73 69 6d 69 6c 61 72 6c 79 20 74 6f  rks similarly to
15e0: 20 3c 3c 2d 2c 20 62 75 74 20 64 6f 65 73 6e 27   <<-, but doesn'
15f0: 74 20 6c 65 61 76 65 20 74 68 65 20 64 69 63 74  t leave the dict
1600: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 0d 0a 20   on the stack.. 
1610: 20 20 20 22 44 45 41 44 42 45 45 46 22 20 3c 2d     "DEADBEEF" <-
1620: 64 65 62 75 67 0d 0a 0d 0a 23 20 24 64 69 63 74  debug....# $dict
1630: 20 2d 3e 6b 65 79 0d 0a 23 20 74 61 6b 65 73 20   ->key..# takes 
1640: 74 68 65 20 76 61 6c 75 65 20 61 74 20 22 6b 65  the value at "ke
1650: 79 22 20 66 72 6f 6d 20 24 64 69 63 74 2c 20 61  y" from $dict, a
1660: 6e 64 20 70 75 74 73 20 69 74 20 6f 6e 20 74 68  nd puts it on th
1670: 65 20 73 74 61 63 6b 20 0d 0a 24 66 75 6e 6e 79  e stack ..$funny
1680: 4e 75 6d 62 65 72 73 20 2d 3e 6c 65 65 74 20 70  Numbers ->leet p
1690: 72 69 6e 74 6c 6e 20 0d 0a 23 20 50 72 69 6e 74  rintln ..# Print
16a0: 73 20 0d 0a 0d 0a 23 20 24 64 69 63 74 20 2d 3e  s ....# $dict ->
16b0: 3e 6b 65 79 0d 0a 23 20 54 61 6b 65 73 20 74 68  >key..# Takes th
16c0: 65 20 76 61 6c 75 65 20 61 74 20 6b 65 79 2c 20  e value at key, 
16d0: 70 75 74 73 20 69 74 20 6f 6e 20 74 68 65 20 73  puts it on the s
16e0: 74 61 63 6b 2c 0d 0a 23 20 61 6e 64 20 6c 65 61  tack,..# and lea
16f0: 76 65 73 20 74 68 65 20 64 69 63 74 69 6f 6e 61  ves the dictiona
1700: 72 79 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66  ry at the top of
1710: 20 74 68 65 20 73 74 61 63 6b 0d 0a 23 0d 0a 23   the stack..#..#
1720: 20 24 64 69 63 74 20 2d 3e 6b 65 79 0d 0a 23 20   $dict ->key..# 
1730: 53 61 6d 65 20 61 73 20 2d 3e 3e 2c 20 62 75 74  Same as ->>, but
1740: 20 64 6f 65 73 20 6e 6f 74 20 6c 65 61 76 65 20   does not leave 
1750: 74 68 65 20 64 69 63 74 69 6f 6e 61 72 79 20 0d  the dictionary .
1760: 0a 23 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66  .# at the top of
1770: 20 74 68 65 20 73 74 61 63 6b 2e 0d 0a 24 7b 20   the stack...${ 
1780: 24 66 75 6e 6e 79 4e 75 6d 62 65 72 73 20 2d 3e  $funnyNumbers ->
1790: 3e 61 6e 73 77 65 72 74 6f 6c 69 66 65 20 2d 3e  >answertolife ->
17a0: 64 65 62 75 67 20 7d 20 70 72 69 6e 74 6c 6e 0d  debug } println.
17b0: 0a 0d 0a 23 20 50 72 69 6e 74 73 3a 0d 0a 23 20  ...# Prints:..# 
17c0: 22 34 32 44 45 41 44 42 45 45 46 22 0d 0a 0d 0a  "42DEADBEEF"....
17d0: 0d 0a 0d 0a 0d 0a 23 20 54 4f 44 4f 3a 20 4d 6f  ......# TODO: Mo
17e0: 72 65 20 65 78 61 6d 70 6c 65 73 0d 0a 3c 2f 70  re examples..</p
17f0: 72 65 3e 0d 0a 3c 2f 6e 6f 77 69 6b 69 3e 0a 5a  re>..</nowiki>.Z
1800: 20 39 62 34 39 35 39 63 30 33 66 37 61 38 34 66   9b4959c03f7a84f
1810: 64 65 37 38 30 33 31 63 32 65 35 62 36 34 63 33  de78031c2e5b64c3
1820: 34 0a                                            4.