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.