| Rev | Author | # | Line |
|---|---|---|---|
| 1 | GlynWebster | 1 | This is a poem, and artifical life simulator, in [Forth] by Leo Wong: |
| 2 | |||
| 3 | AristotlePagaltzis | 3 | <verbatim> |
| 4 | \ Conway's Game of Life, or Occam's Razor Dulled | ||
| 1 | GlynWebster | 5 | |
| 3 | AristotlePagaltzis | 6 | MARKER Genesis |
| 1 | GlynWebster | 7 | |
| 3 | AristotlePagaltzis | 8 | \ ANS Forth this life is remains and |
| 9 | 1 CHARS CONSTANT /Char | ||
| 10 | : C+! ( char c-addr -- ) DUP >R C@ + R> C! ; | ||
| 1 | GlynWebster | 11 | |
| 3 | AristotlePagaltzis | 12 | \ the universal pattern |
| 13 | 25 CONSTANT How-Deep | ||
| 14 | 80 CONSTANT How-Wide | ||
| 15 | How-Wide How-Deep * 1- \ 1- prevents scrolling on my screen | ||
| 16 | CONSTANT Homes | ||
| 1 | GlynWebster | 17 | |
| 3 | AristotlePagaltzis | 18 | \ world wrap |
| 19 | : World | ||
| 20 | CREATE ( -- ) Homes CHARS ALLOT | ||
| 21 | DOES> ( u -- c-addr ) SWAP Homes + Homes MOD CHARS + ; | ||
| 1 | GlynWebster | 22 | |
| 3 | AristotlePagaltzis | 23 | World old |
| 24 | World new | ||
| 1 | GlynWebster | 25 | |
| 3 | AristotlePagaltzis | 26 | \ biostatistics |
| 1 | GlynWebster | 27 | |
| 3 | AristotlePagaltzis | 28 | \ begin hexadecimal numbering |
| 29 | HEX \ hex xy : x holds life , y holds neighbors count | ||
| 1 | GlynWebster | 30 | |
| 3 | AristotlePagaltzis | 31 | 10 CONSTANT Alive \ 0y = not alive |
| 1 | GlynWebster | 32 | |
| 3 | AristotlePagaltzis | 33 | \ Conway's rules: |
| 34 | \ a life depends on the number of its next-door neighbors | ||
| 1 | GlynWebster | 35 | |
| 3 | AristotlePagaltzis | 36 | \ it dies if it has fewer than 2 neighbors |
| 37 | : Lonely ( char -- flag ) 12 < ; | ||
| 1 | GlynWebster | 38 | |
| 3 | AristotlePagaltzis | 39 | \ it dies if it has more than 3 neighbors |
| 40 | : Crowded ( char -- flag ) 13 > ; | ||
| 1 | GlynWebster | 41 | |
| 3 | AristotlePagaltzis | 42 | : -Sustaining ( char -- flag ) |
| 43 | DUP Lonely SWAP Crowded OR ; | ||
| 1 | GlynWebster | 44 | |
| 3 | AristotlePagaltzis | 45 | \ it is born if it has exactly 3 neighbors |
| 46 | : Quickening ( char -- flag ) | ||
| 47 | 03 = ; | ||
| 1 | GlynWebster | 48 | |
| 3 | AristotlePagaltzis | 49 | \ back to decimal |
| 50 | DECIMAL | ||
| 1 | GlynWebster | 51 | |
| 3 | AristotlePagaltzis | 52 | \ compass points |
| 53 | : N ( i -- j ) How-Wide - ; | ||
| 54 | : S ( i -- j ) How-Wide + ; | ||
| 55 | : E ( i -- j ) 1+ ; | ||
| 56 | : W ( i -- j ) 1- ; | ||
| 1 | GlynWebster | 57 | |
| 3 | AristotlePagaltzis | 58 | \ census |
| 59 | : Home+! ( -1|1 i -- ) >R Alive * R> new C+! ; | ||
| 1 | GlynWebster | 60 | |
| 3 | AristotlePagaltzis | 61 | : Neighbors+! ( -1|0|1 i -- ) |
| 62 | 2DUP N W new C+! 2DUP N new C+! 2DUP N E new C+! | ||
| 63 | 2DUP W new C+! ( i ) 2DUP E new C+! | ||
| 64 | 2DUP S W new C+! 2DUP S new C+! S E new C+! ; | ||
| 1 | GlynWebster | 65 | |
| 3 | AristotlePagaltzis | 66 | : Bureau-of-Vital-Statistics ( -1|1 i -- ) |
| 67 | 2DUP Home+! Neighbors+! ; | ||
| 1 | GlynWebster | 68 | |
| 3 | AristotlePagaltzis | 69 | \ mortal coils |
| 70 | CHAR ? CONSTANT Soul | ||
| 71 | BL CONSTANT Body | ||
| 1 | GlynWebster | 72 | |
| 3 | AristotlePagaltzis | 73 | \ at home |
| 74 | : Home ( char i -- ) How-Wide /MOD AT-XY EMIT ; | ||
| 1 | GlynWebster | 75 | |
| 3 | AristotlePagaltzis | 76 | \ changes, changes |
| 77 | : Is-Born ( i -- ) | ||
| 78 | Soul OVER Home | ||
| 79 | 1 SWAP Bureau-of-Vital-Statistics ; | ||
| 80 | : Dies ( i -- ) | ||
| 81 | Body OVER Home | ||
| 82 | -1 SWAP Bureau-of-Vital-Statistics ; | ||
| 1 | GlynWebster | 83 | |
| 3 | AristotlePagaltzis | 84 | \ the one and the many |
| 85 | : One ( c-addr -- i ) | ||
| 86 | 0 old - /Char / ; | ||
| 1 | GlynWebster | 87 | |
| 3 | AristotlePagaltzis | 88 | : Everything ( -- ) |
| 89 | 0 old Homes | ||
| 90 | BEGIN DUP | ||
| 91 | WHILE OVER C@ DUP Alive AND | ||
| 92 | IF -Sustaining IF OVER One Dies THEN | ||
| 93 | ELSE Quickening IF OVER One Is-Born THEN THEN | ||
| 94 | 1 /STRING | ||
| 95 | REPEAT 2DROP | ||
| 96 | How-Wide 1- How-Deep 1- AT-XY ; | ||
| 1 | GlynWebster | 97 | |
| 3 | AristotlePagaltzis | 98 | \ in the beginning |
| 99 | : Chaos ( -- ) | ||
| 100 | 0 old Homes BLANK ; | ||
| 1 | GlynWebster | 101 | |
| 3 | AristotlePagaltzis | 102 | \ an angel |
| 103 | : Serpent ( -- ) | ||
| 104 | 0 2 AT-XY ." Press a key for knowledge." KEY DROP | ||
| 105 | 0 2 AT-XY ." Press space to re-start, Esc to escape life." ; | ||
| 1 | GlynWebster | 106 | |
| 3 | AristotlePagaltzis | 107 | \ spirit |
| 108 | : Say ( -- addr u ) | ||
| 109 | PAGE | ||
| 110 | ." Say: " 0 new DUP Homes ACCEPT ; | ||
| 1 | GlynWebster | 111 | |
| 3 | AristotlePagaltzis | 112 | \ before history |
| 113 | : Innocence ( -- ) | ||
| 114 | Homes 0 | ||
| 115 | DO I new C@ Alive / I Neighbors+! LOOP ; | ||
| 1 | GlynWebster | 116 | |
| 3 | AristotlePagaltzis | 117 | \ children become parents |
| 118 | : Passes ( -- ) 0 new 0 old Homes CMOVE ; | ||
| 1 | GlynWebster | 119 | |
| 3 | AristotlePagaltzis | 120 | \ a garden |
| 121 | : Paradise ( addr u -- ) | ||
| 122 | >R How-Deep How-Wide * How-Deep 2 MOD 0= How-Wide AND - | ||
| 123 | R@ - 2/ old | ||
| 124 | R> CMOVE | ||
| 125 | 0 old Homes 0 | ||
| 126 | DO COUNT BL <> | ||
| 127 | DUP Alive AND I new C! | ||
| 128 | IF Soul I Home THEN | ||
| 129 | LOOP DROP | ||
| 130 | Serpent | ||
| 131 | Innocence Passes ; | ||
| 1 | GlynWebster | 132 | |
| 3 | AristotlePagaltzis | 133 | : Creation ( -- ) Chaos Say Paradise ; |
| 134 | : Generation ( -- ) Everything Passes ; | ||
| 1 | GlynWebster | 135 | |
| 3 | AristotlePagaltzis | 136 | \ the human element |
| 1 | GlynWebster | 137 | |
| 3 | AristotlePagaltzis | 138 | 100 VALUE Ideas |
| 139 | : Dreams ( -- ) Ideas MS ; | ||
| 1 | GlynWebster | 140 | |
| 3 | AristotlePagaltzis | 141 | 100 CONSTANT Images |
| 142 | : Meditation ( -- ) Images MS ; | ||
| 1 | GlynWebster | 143 | |
| 3 | AristotlePagaltzis | 144 | \ free will |
| 145 | : Action ( -- char ) | ||
| 146 | KEY? DUP | ||
| 147 | IF DROP KEY | ||
| 148 | DUP BL = IF Creation THEN | ||
| 149 | THEN ; | ||
| 1 | GlynWebster | 150 | |
| 3 | AristotlePagaltzis | 151 | \ illusion |
| 152 | : Samsara ( -- char ) Dreams Action Meditation ; | ||
| 1 | GlynWebster | 153 | |
| 3 | AristotlePagaltzis | 154 | \ life without comments |
| 155 | 27 CONSTANT Escape | ||
| 156 | : Acceptance ( char -- flag ) Escape <> ; | ||
| 157 | : Mutability ( -- flag ) Generation Samsara Acceptance ; | ||
| 158 | : Goes-On ( -- ) BEGIN Mutability 0= UNTIL ; | ||
| 1 | GlynWebster | 159 | |
| 3 | AristotlePagaltzis | 160 | : Life ( -- ) Creation Goes-On ; |
| 1 | GlynWebster | 161 | |
| 3 | AristotlePagaltzis | 162 | Life |
| 1 | GlynWebster | 163 | |
| 3 | AristotlePagaltzis | 164 | \ 950724 + 970702 + |
| 165 | </verbatim> |
lib/blame.php:177: Warning: Invalid argument supplied for foreach()