From e1790c55bd011eca3251c46766cc759a47039091 Mon Sep 17 00:00:00 2001 From: Lassi Kortela Date: Sat, 11 Mar 2023 22:16:44 +0200 Subject: [PATCH] Download from Wayback Machine These binary files are shown in the log but excluded from this commit: * gps10bin.zip * gps10src.zip * mfc40dll.zip $ wayback_machine_downloader --all-timestamps www.cs.bgu.ac.il/~elad/GALAPAGOS Downloading www.cs.bgu.ac.il/~elad/GALAPAGOS to websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/ from Wayback Machine archives. Getting snapshot pages.. found 52 snaphots to consider. file_list_curated: 52 52 files to download: http://www.cs.bgu.ac.il:80/~elad/GALAPAGOS/ -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970726164741/~elad/GALAPAGOS/index.html (1/52) http://www.cs.bgu.ac.il:80/%7Eelad/GALAPAGOS/ -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19981205205433/~elad/GALAPAGOS/index.html (2/52) http://www.cs.bgu.ac.il:80/~elad/GALAPAGOS/ -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20010430130433/~elad/GALAPAGOS/index.html (3/52) https://www.cs.bgu.ac.il/~elad/GALAPAGOS/ -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20220312053305/~elad/GALAPAGOS/index.html (4/52) https://www.cs.bgu.ac.il/~elad/GALAPAGOS/ -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20220312053307/~elad/GALAPAGOS/index.html (5/52) http://www.cs.bgu.ac.il:80/~elad/GALAPAGOS/back.gif -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032339/~elad/GALAPAGOS/back.gif (6/52) http://www.cs.bgu.ac.il:80/~elad/GALAPAGOS/background.html -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970806122533/~elad/GALAPAGOS/background.html (7/52) http://www.cs.bgu.ac.il:80/%7Eelad/GALAPAGOS/background.html -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19991006050747/~elad/GALAPAGOS/background.html (8/52) http://www.cs.bgu.ac.il:80/~elad/GALAPAGOS/background.html -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20010608213604/~elad/GALAPAGOS/background.html (9/52) http://www.cs.bgu.ac.il:80/~elad/GALAPAGOS/bgu_logo_tiny.gif -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970806122524/~elad/GALAPAGOS/bgu_logo_tiny.gif (10/52) http://www.cs.bgu.ac.il:80/~elad/GALAPAGOS/bib.html -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970806122740/~elad/GALAPAGOS/bib.html (11/52) http://www.cs.bgu.ac.il:80/%7Eelad/GALAPAGOS/bib.html -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19991006061546/~elad/GALAPAGOS/bib.html (12/52) http://www.cs.bgu.ac.il:80/~elad/GALAPAGOS/bib.html -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20010608214537/~elad/GALAPAGOS/bib.html (13/52) http://www.cs.bgu.ac.il:80/~elad/GALAPAGOS/Envs.gif -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032348/~elad/GALAPAGOS/Envs.gif (14/52) http://www.cs.bgu.ac.il:80/~elad/GALAPAGOS/Envs2.gif -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032356/~elad/GALAPAGOS/Envs2.gif (15/52) http://www.cs.bgu.ac.il:80/~elad/GALAPAGOS/extensions.html -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970806122623/~elad/GALAPAGOS/extensions.html (16/52) http://www.cs.bgu.ac.il:80/%7Eelad/GALAPAGOS/extensions.html -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19990424140956/~elad/GALAPAGOS/extensions.html (17/52) http://www.cs.bgu.ac.il:80/~elad/GALAPAGOS/extensions.html -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20010608215359/~elad/GALAPAGOS/extensions.html (18/52) http://www.cs.bgu.ac.il:80/~elad/GALAPAGOS/gps.gif -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970806122512/~elad/GALAPAGOS/gps.gif (19/52) http://www.cs.bgu.ac.il:80/~elad/GALAPAGOS/gps10bin.zip -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970806123128/~elad/GALAPAGOS/gps10bin.zip (20/52) http://www.cs.bgu.ac.il:80/~elad/GALAPAGOS/gps10src.zip -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970806123709/~elad/GALAPAGOS/gps10src.zip (21/52) http://www.cs.bgu.ac.il:80/~elad/GALAPAGOS/gui.html -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970806122632/~elad/GALAPAGOS/gui.html (22/52) http://www.cs.bgu.ac.il:80/%7Eelad/GALAPAGOS/gui.html -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19990128140433/~elad/GALAPAGOS/gui.html (23/52) http://www.cs.bgu.ac.il:80/~elad/GALAPAGOS/gui.html -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20010608220120/~elad/GALAPAGOS/gui.html (24/52) http://www.cs.bgu.ac.il:80/~elad/GALAPAGOS/img00001.gif -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032406/~elad/GALAPAGOS/img00001.gif (25/52) http://www.cs.bgu.ac.il:80/~elad/GALAPAGOS/img00002.gif -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032416/~elad/GALAPAGOS/img00002.gif (26/52) http://www.cs.bgu.ac.il:80/~elad/GALAPAGOS/img00002.gif -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20000427155438/~elad/GALAPAGOS/img00002.gif (27/52) http://www.cs.bgu.ac.il:80/~elad/GALAPAGOS/img00002.gif -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20000927202854/~elad/GALAPAGOS/img00002.gif (28/52) http://www.cs.bgu.ac.il:80/~elad/GALAPAGOS/img00003.gif -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032426/~elad/GALAPAGOS/img00003.gif (29/52) http://www.cs.bgu.ac.il:80/~elad/GALAPAGOS/img00010.gif -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032447/~elad/GALAPAGOS/img00010.gif (30/52) http://www.cs.bgu.ac.il:80/~elad/GALAPAGOS/img00011.gif -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032457/~elad/GALAPAGOS/img00011.gif (31/52) http://www.cs.bgu.ac.il:80/~elad/GALAPAGOS/img00012.gif -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032510/~elad/GALAPAGOS/img00012.gif (32/52) http://www.cs.bgu.ac.il:80/~elad/GALAPAGOS/img00013.gif -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032521/~elad/GALAPAGOS/img00013.gif (33/52) http://www.cs.bgu.ac.il:80/~elad/GALAPAGOS/implementation.html -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970806122650/~elad/GALAPAGOS/implementation.html (34/52) http://www.cs.bgu.ac.il:80/%7Eelad/GALAPAGOS/implementation.html -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19990128153816/~elad/GALAPAGOS/implementation.html (35/52) http://www.cs.bgu.ac.il:80/~elad/GALAPAGOS/implementation.html -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20010608220848/~elad/GALAPAGOS/implementation.html (36/52) http://www.cs.bgu.ac.il:80/~elad/GALAPAGOS/index.html -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032301/~elad/GALAPAGOS/index.html (37/52) http://www.cs.bgu.ac.il:80/%7Eelad/GALAPAGOS/index.html -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19990417073305/~elad/GALAPAGOS/index.html (38/52) http://www.cs.bgu.ac.il:80/~elad/GALAPAGOS/index.html -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20010921035619/~elad/GALAPAGOS/index.html (39/52) http://www.cs.bgu.ac.il:80/~elad/GALAPAGOS/manual.html -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970806122731/~elad/GALAPAGOS/manual.html (40/52) http://www.cs.bgu.ac.il:80/%7Eelad/GALAPAGOS/manual.html -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19990129014748/~elad/GALAPAGOS/manual.html (41/52) http://www.cs.bgu.ac.il:80/~elad/GALAPAGOS/manual.html -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20010608221151/~elad/GALAPAGOS/manual.html (42/52) http://www.cs.bgu.ac.il:80/~elad/GALAPAGOS/mfc40dll.zip -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20010614210623/~elad/GALAPAGOS/mfc40dll.zip (43/52) http://www.cs.bgu.ac.il:80/~elad/GALAPAGOS/next.gif -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032317/~elad/GALAPAGOS/next.gif (44/52) http://www.cs.bgu.ac.il:80/~elad/GALAPAGOS/next.gif -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20000429040644/~elad/GALAPAGOS/next.gif (45/52) http://www.cs.bgu.ac.il:80/~elad/GALAPAGOS/next.gif -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20000927044316/~elad/GALAPAGOS/next.gif (46/52) http://www.cs.bgu.ac.il:80/~elad/GALAPAGOS/prev.gif -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032310/~elad/GALAPAGOS/prev.gif (47/52) http://www.cs.bgu.ac.il:80/~elad/GALAPAGOS/stone.jpg -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970806122448/~elad/GALAPAGOS/stone.jpg (48/52) http://www.cs.bgu.ac.il:80/~elad/GALAPAGOS/toc.gif -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032330/~elad/GALAPAGOS/toc.gif (49/52) http://www.cs.bgu.ac.il:80/~elad/GALAPAGOS/toc.gif -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20000427162611/~elad/GALAPAGOS/toc.gif (50/52) http://www.cs.bgu.ac.il:80/~elad/GALAPAGOS/toc.gif -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20000927020528/~elad/GALAPAGOS/toc.gif (51/52) http://www.cs.bgu.ac.il:80/~elad/GALAPAGOS/vision.gif -> websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032438/~elad/GALAPAGOS/vision.gif (52/52) Download completed in 87.05s, saved in websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/ (52 files) --- .../19970726164741/~elad/GALAPAGOS/index.html | 95 ++ .../19970806122448/~elad/GALAPAGOS/stone.jpg | Bin 0 -> 5661 bytes .../19970806122512/~elad/GALAPAGOS/gps.gif | Bin 0 -> 40478 bytes .../~elad/GALAPAGOS/bgu_logo_tiny.gif | Bin 0 -> 137 bytes .../~elad/GALAPAGOS/background.html | 130 ++ .../~elad/GALAPAGOS/extensions.html | 493 ++++++ .../19970806122632/~elad/GALAPAGOS/gui.html | 73 + .../~elad/GALAPAGOS/implementation.html | 393 +++++ .../~elad/GALAPAGOS/manual.html | 1404 +++++++++++++++++ .../19970806122740/~elad/GALAPAGOS/bib.html | 81 + .../19970812032301/~elad/GALAPAGOS/index.html | 95 ++ .../19970812032310/~elad/GALAPAGOS/prev.gif | Bin 0 -> 752 bytes .../19970812032317/~elad/GALAPAGOS/next.gif | Bin 0 -> 740 bytes .../19970812032330/~elad/GALAPAGOS/toc.gif | Bin 0 -> 2417 bytes .../19970812032339/~elad/GALAPAGOS/back.gif | Bin 0 -> 1543 bytes .../19970812032348/~elad/GALAPAGOS/Envs.gif | Bin 0 -> 1429 bytes .../19970812032356/~elad/GALAPAGOS/Envs2.gif | Bin 0 -> 1780 bytes .../~elad/GALAPAGOS/img00001.gif | Bin 0 -> 6581 bytes .../~elad/GALAPAGOS/img00002.gif | Bin 0 -> 6853 bytes .../~elad/GALAPAGOS/img00003.gif | Bin 0 -> 1085 bytes .../19970812032438/~elad/GALAPAGOS/vision.gif | Bin 0 -> 3536 bytes .../~elad/GALAPAGOS/img00010.gif | Bin 0 -> 1031 bytes .../~elad/GALAPAGOS/img00011.gif | Bin 0 -> 3801 bytes .../~elad/GALAPAGOS/img00012.gif | Bin 0 -> 18528 bytes .../~elad/GALAPAGOS/img00013.gif | Bin 0 -> 4653 bytes .../19981205205433/~elad/GALAPAGOS/index.html | 95 ++ .../19990128140433/~elad/GALAPAGOS/gui.html | 73 + .../~elad/GALAPAGOS/implementation.html | 393 +++++ .../~elad/GALAPAGOS/manual.html | 1404 +++++++++++++++++ .../19990417073305/~elad/GALAPAGOS/index.html | 95 ++ .../~elad/GALAPAGOS/extensions.html | 493 ++++++ .../~elad/GALAPAGOS/background.html | 130 ++ .../19991006061546/~elad/GALAPAGOS/bib.html | 81 + .../~elad/GALAPAGOS/img00002.gif | Bin 0 -> 6853 bytes .../20000427162611/~elad/GALAPAGOS/toc.gif | Bin 0 -> 2417 bytes .../20000429040644/~elad/GALAPAGOS/next.gif | Bin 0 -> 740 bytes .../20000927020528/~elad/GALAPAGOS/toc.gif | Bin 0 -> 2417 bytes .../20000927044316/~elad/GALAPAGOS/next.gif | Bin 0 -> 740 bytes .../~elad/GALAPAGOS/img00002.gif | Bin 0 -> 6853 bytes .../20010430130433/~elad/GALAPAGOS/index.html | 95 ++ .../~elad/GALAPAGOS/background.html | 130 ++ .../20010608214537/~elad/GALAPAGOS/bib.html | 81 + .../~elad/GALAPAGOS/extensions.html | 493 ++++++ .../20010608220120/~elad/GALAPAGOS/gui.html | 73 + .../~elad/GALAPAGOS/implementation.html | 393 +++++ .../~elad/GALAPAGOS/manual.html | 1404 +++++++++++++++++ .../20010921035619/~elad/GALAPAGOS/index.html | 95 ++ .../20220312053305/~elad/GALAPAGOS/index.html | 95 ++ .../20220312053307/~elad/GALAPAGOS/index.html | 95 ++ 49 files changed, 8482 insertions(+) create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970726164741/~elad/GALAPAGOS/index.html create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970806122448/~elad/GALAPAGOS/stone.jpg create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970806122512/~elad/GALAPAGOS/gps.gif create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970806122524/~elad/GALAPAGOS/bgu_logo_tiny.gif create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970806122533/~elad/GALAPAGOS/background.html create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970806122623/~elad/GALAPAGOS/extensions.html create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970806122632/~elad/GALAPAGOS/gui.html create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970806122650/~elad/GALAPAGOS/implementation.html create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970806122731/~elad/GALAPAGOS/manual.html create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970806122740/~elad/GALAPAGOS/bib.html create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032301/~elad/GALAPAGOS/index.html create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032310/~elad/GALAPAGOS/prev.gif create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032317/~elad/GALAPAGOS/next.gif create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032330/~elad/GALAPAGOS/toc.gif create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032339/~elad/GALAPAGOS/back.gif create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032348/~elad/GALAPAGOS/Envs.gif create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032356/~elad/GALAPAGOS/Envs2.gif create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032406/~elad/GALAPAGOS/img00001.gif create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032416/~elad/GALAPAGOS/img00002.gif create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032426/~elad/GALAPAGOS/img00003.gif create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032438/~elad/GALAPAGOS/vision.gif create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032447/~elad/GALAPAGOS/img00010.gif create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032457/~elad/GALAPAGOS/img00011.gif create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032510/~elad/GALAPAGOS/img00012.gif create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032521/~elad/GALAPAGOS/img00013.gif create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19981205205433/~elad/GALAPAGOS/index.html create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19990128140433/~elad/GALAPAGOS/gui.html create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19990128153816/~elad/GALAPAGOS/implementation.html create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19990129014748/~elad/GALAPAGOS/manual.html create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19990417073305/~elad/GALAPAGOS/index.html create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19990424140956/~elad/GALAPAGOS/extensions.html create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19991006050747/~elad/GALAPAGOS/background.html create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19991006061546/~elad/GALAPAGOS/bib.html create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20000427155438/~elad/GALAPAGOS/img00002.gif create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20000427162611/~elad/GALAPAGOS/toc.gif create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20000429040644/~elad/GALAPAGOS/next.gif create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20000927020528/~elad/GALAPAGOS/toc.gif create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20000927044316/~elad/GALAPAGOS/next.gif create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20000927202854/~elad/GALAPAGOS/img00002.gif create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20010430130433/~elad/GALAPAGOS/index.html create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20010608213604/~elad/GALAPAGOS/background.html create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20010608214537/~elad/GALAPAGOS/bib.html create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20010608215359/~elad/GALAPAGOS/extensions.html create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20010608220120/~elad/GALAPAGOS/gui.html create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20010608220848/~elad/GALAPAGOS/implementation.html create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20010608221151/~elad/GALAPAGOS/manual.html create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20010921035619/~elad/GALAPAGOS/index.html create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20220312053305/~elad/GALAPAGOS/index.html create mode 100644 websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20220312053307/~elad/GALAPAGOS/index.html diff --git a/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970726164741/~elad/GALAPAGOS/index.html b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970726164741/~elad/GALAPAGOS/index.html new file mode 100644 index 0000000..56faa74 --- /dev/null +++ b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970726164741/~elad/GALAPAGOS/index.html @@ -0,0 +1,95 @@ + + + + Galapagos + + + +

Welcome to
+GALAPAGOS

+ +Galapagos is an interactive multithreaded Scheme interpreter with turtle +graphics for Windows 95. It is built around the SCM interpreter, and it +provides multiple interpreters, threads, turtles, and drawing boards, all +running concurrently using WIN32's multithreading abilities, and freely +available. + +

+


+

+

+

+Spring 1997

+Graduation project

+Department of Math & Computer Science,

+Ben-Gurion University of the Negev

+
+Written by Elad Eyal and Miki +Tebeka.
+
+Supervisor: Dr. Michael Elhadad +
+

+

+


+

+ +

TABLE OF CONTENTS

+ + + +

+ +
+ +

DOWNLOAD CENTER

+

+

GNU LICENSE. COPYRIGHTED. PROVIDED "AS IS". NO +WARRANTIES OR LIABILITIES. ETC.
+

+

+500K gps10bin.zip - Executable and required Scheme libraries (SLIB)
+700K gps10src.zip - Same with all source code
+400K mfc40dll.zip - You might need this MFC40.DLL if you +don't have it already.
+ + diff --git a/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970806122448/~elad/GALAPAGOS/stone.jpg b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970806122448/~elad/GALAPAGOS/stone.jpg new file mode 100644 index 0000000000000000000000000000000000000000..692b2ef72123e2547c9e755651e541b6c7f18588 GIT binary patch literal 5661 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 AC;$Ke literal 0 HcmV?d00001 diff --git a/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970806122512/~elad/GALAPAGOS/gps.gif b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970806122512/~elad/GALAPAGOS/gps.gif new file mode 100644 index 0000000000000000000000000000000000000000..5ec3570627654d7e9a51b4df6a1a5145c1489dbc GIT binary patch literal 40478 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 literal 0 HcmV?d00001 diff --git a/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970806122524/~elad/GALAPAGOS/bgu_logo_tiny.gif b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970806122524/~elad/GALAPAGOS/bgu_logo_tiny.gif new file mode 100644 index 0000000000000000000000000000000000000000..44b8d310afd7d7f36156a4ae3a89d33e2355ecc4 GIT binary patch literal 137 zcmV;40CxXJNk%w1VH5x(0Pp|+|6&0D|NkNR1OWg50RSuj0000K03!eZ0$_}fsT;s= zfP+g;daT4*UuZQUHEQ72p~{GutD1fh+_LlI&T + + + Galapagos - Background + + + + + +

+

+ [PREV] + [PREV] + [PREV] +
+
+

+

Background

+ + + +

+

+ +

SCHEME

+ +

Scheme is a dialect of Lisp that stresses conceptual elegance and simplicity. +It is specified in R4RS and IEEE standard P1178. Scheme is much smaller +than Common Lisp; the specification is about 50 pages, compared to Common +Lisp's 1300 page draft standard. (See the Lisp FAQ for details on standards +for Common Lisp.) Advocates of Scheme often find it amusing that the entire +Scheme standard is shorter than the index to Guy Steele's "Common +Lisp: the Language, 2nd Edition".
+

+ +

Scheme is often used in computer science curricula and programming language +research, due to its ability to represent many programming abstractions +with its simple primitives.
+

+ +

There are a lot of traditional SCHEME interpreter available such as +Chez, ELK 2.1, GAMBIT, MITScheme, scheme->C, Scheme48, T3.1, VSCM and +Scm4e. Many free Scheme implementations (as well as SCM) are available +from swiss-ftp.ai.mit.edu [18.43.0.246].
+

+ +

Galapagos is built over the SCM interpreter version 4e4 written by Aubrey +Jaffer <jaffer@ai.mit.edu>.
+
+
+

+ +

LOGO AND TURTLE GEOMETRY
+

+ +

LOGO is a programming language designed for use by learners, including +children. It is a dialect of LISP which has a more natural syntax, using +infix arithmetics and (almost) no parentheses. LOGO features a "turtle" +which can be instructed to move across the screen and draw shapes. This +became known as "Turtle Graphics" or "Turtle Geometry" +- a geometry that describes paths "from within" rather than "from +outside" or "from above." For example, "turn right" +means turn right relative to whatever direction you were heading before; +by contrast, "turn east" specifies an apparently absolute direction. +A Logo user or program manipulates the graphical turtle by telling it to +move forward or back some number of steps, or by telling it to turn left +or right some number of degrees.
+

+ +

Turtle geometry has two major advantages. One is that many paths are +more simply described in relative than in absolute terms. For example, +it's easy to indicate the absolute coordinates of the corners of a square +with vertical and horizontal sides, but it's not so easy to find the corners +of an inclined square. In turtle geometry the same commands (go forward, +turn right 90 degrees, etc.) work for squares with any orientation. +The second advantage is pedagogic rather than computational: turtle geometry +is compatible with a learner's own experience of moving in the world - +it's "body syntonic."
+

+ +

OBJECTIVES
+

+ +

The two major goals behind Galapagos were:
+

+ +

First, we wanted to create an environment suitable for teaching programming, +patterned after Logo's environment and its easy-to-understand, easy-to-use +turtle geometry. We chose Scheme as the programming language because of +its educational value, as noted before. We added Turtle Graphics because +of its ability to visualize computations, and thus help understanding them +better.
+

+ +

Second, we wanted to add parallel programming. The importance of multiprocessor +machines and of multithreading is becoming more apparent every day, and +so is the need for tools to help understanding parallel programming paradigms. +By extending Scheme to be multithreaded, we wanted to create such a tool.
+

+ +

AVAILABILITY
+

+ +

Galapagos was developed to run under Windows 95, and should work under +Window NT as well. (It uses 32-bit specific code so Win32s is not enough +to run Galapagos). Both binary and source are available at the +homepage:
+

+ +

+http://www.cs.bgu.ac.il/~elad/GALAPAGOS + +

+ + +

+


+
+ [TOP] + [PREV] + [PREV] + [PREV] +
+ + diff --git a/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970806122623/~elad/GALAPAGOS/extensions.html b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970806122623/~elad/GALAPAGOS/extensions.html new file mode 100644 index 0000000..67d97f1 --- /dev/null +++ b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970806122623/~elad/GALAPAGOS/extensions.html @@ -0,0 +1,493 @@ + + + + Galapagos - Scheme Extensions + + + + + +
+ [PREV] + [PREV] + [PREV] +
+
+

+ +

SCHEME EXTENSIONS
+

+ + + +

+


+ +

We have extended Scheme in two main +directions: Turtle graphics and multithreading:
+

+ +

The turtle object lives on a board on which it can move and draw. +A turtle can also communicate with the board and "see" colors +or other turtles. Galapagos Scheme provides a set of primitives to create +and manage such turtles and the boards they live on.
+

+ +

A set of additional primitives enable the programmer to create multiple +interpreters that run concurrently. The environment model was extended +to support shared or thread-specific environments, and primitives to handle +multiple environments were also added.
+
+

+ +

THE NEW ENVIRONMENT MODEL
+

+ +

A frame is a table which maps (or binds) names to values. An +environment is a chained list of frames in which the interpreter works. +

+ +

For example the command:

+ +

(define x 7)

+ +

creates a binding between x and the value 7.

+ +

A typical environment looks like this:

+ +

+
+

+
+
+
+Each rectangle denotes a frame and inside it are the bindings it holds. +The rightmost rectangle is the global environment.
+

+ +

When a variable is evaluated, the interpreter first tries to find it +in the current frame. If a suitable binding can't be found, the interpreter +moves to the next frame in the environment and searched for a binding there.
+

+ +

In our example if we write x in the command line we'll get 12 +as the answer because all such computations take place at the global environment. +
+

+ +

A function application is always evaluated with respect to the environment +the in which it was defined. (A function "holds" its environment, +hence the name "closure") This means that if we write

+ +

(define (f) x)

+ +

and then

+ +

(f)

+ +

the result will be

+ +

12.
+
+
+
+
+

+
+

+
+In traditional SCHEME we have only one interpreter running at a time, so +at a given point of calculation there is only one environment. In Galapagos +multiple interpreters can run at the same time, and each of them has its +own environment.
+

+ +

Under Galapagos's environment model, every interpreter works on its +branch of an "environments tree", but can also evaluate an expression +in any other environment in the tree. If two interpreters have a shared +node on the tree, then from that point up (towards the global environment) +all the bindings are the same for the two interpreters. The global environment +is shared by all interpreters. If an interpreter changes the value of some +variable, the binding is changed in all other interpreters that have access +to the frame where the variable was declared. Obviously, caution should +be taken when writing to a shared variable.
+

+ +

As an example, if a user created two new threads, called A and B, and +then evaluated:

+ +

First thread> (define +x 7)

+ +

(define (f) ...)

+ +

Thread A> (define (g) +x)

+ +

Thread B> (define x 4) +

+ +

this is how the environment model would look like:
+

+ +


+

+ +

Now consider what happens when the user evaluates this:

+ +

Thread A> (set! f g) +

+ +


+
+

+ +

Now, evaluating (f) in thread B will call the function defined +in thread A. It will return 12 which is the value of x in f's environment. +If thread A defines a new x (using define), it will affect the result +of subsequent calls to f.
+

+ +

Sharing environments and frames are Galapagos's way of allowing shared +data. By default, however, most calculations are done at thread-specific +frames. (More on this subject in the next section). Primitives are supplied +to explicitly reference and manage environments: clone-environment +can create a copy of an environment (so changing a binding in one copy +does not alter the other); extend-environment and pop-environment +can add and remove frames to and from environments. More environment functions +are found in the next section of this document.
+

+ +

THREADS
+

+ +

A thread is a SCHEME interpreter. The base environment of a thread +is the thread's topmost environment. All forms entered at the thread's +console or as arguments to new-thread are evaluated in the base +environment. In traditional SCHEME there is only one thread of execution. +It is a single thread and its base environment is the global environment. +In Galapagos many interpreters can run concurrently, and each have its +own environment (changing dynamically as computation progresses) and a +base environment (which can be explicitly changed).
+

+ +

One thread is created by Galapagos upon startup. It is called the main +thread, and it lasts for the whole Galapagos session. Its base environment +is the global one - much like a traditional Scheme interpreter. Additional +threads can be created using new-thread. These have their base environment +set to a new environment, containing a single fresh frame pointing to the +global environment. Any calculation done at the new thread's console takes +place in this thread-local environment. However, if closure functions are +used, then their evaluation may take place at the global environment or +at some other thread's space, depending on where that function was defined. +
+

+ +

When a thread finishes the execution of its commands it terminates. +There are two exceptions to this rule:

+ +
    +
  1. The main thread can be only terminated by using quit-program. +
  2. + +
  3. A thread that is bound to the console will not terminate at the end +of execution but will wait for the next command input.
  4. +
+ +

Threads can communicate using the predicate tell-thread or by +using the asynchronous message-queues system described later. In addition, +SCM's arbiters were improved to be multithread safe. An arbiter +object can serve as a guard on a critical section (where only one thread +can work at a given time) of the program. The relevant primitves are make-arbiter, +try-arbiter, and release-arbiter.
+

+ +

Note: Galapagos supports Scheme's notation of continuations. +However, two restrictions apply:

+ +
    +
  1. Only "cheap" continuations are supported. That is, a continuation +can only be called when it is still active. This allows for continuations +to be used to implement exception handling, etc.
  2. + +
  3. Continuations can not cross thread boundaries. Also continuations, +like any other Scheme object, can be handled by any thread, they can only +be called from within the thread that created them. Trying to call a continuation +from a different thread will cause an error.
  4. +
+ +

CONSOLES
+

+ +

A console is a text window where the user can type commands (when +the interpreter is idle) and see output. A console has a name which can +be changed dynamically, which appears on its title bar. A thread may or +may not be bound to a console. Information printed by a non-bound thread +is lost; a non-bound thread waiting for input is stuck (unless provisions +were made to allow a new console to be created by means of inter-thread +communications.) If a non-bound thread has nothing to do, instead of waiting +for input like a bound thread, it will terminate.
+

+ +

The main thread is always bound to a console. To bind a thread to a +console use the command bind-to-console from within the thread.
+

+ +

DRAWING BOARDS
+

+ +

A board (window) is the graphical board on which the turtles and the +user draw. It is a bitmap on which the user can draw interactively, by +using the supplied GUI, or by creating turtles and instructing them to +do the drawings.
+

+ +

The controls of the graphical user interface are located on the toolbar. +The "shapes" of drawing are either a rectangle, a line or free +hand drawing. The user pen can have three widths which are found under +the User Pen menu. The numbers next to the sizes are the widths +in pixels.
+

+ +

The colors of the user pen can be changes either from the User Pen +menu or from the toolbar's color buttons. When choosing from a toolbar +button, the user can know exactly what color (in RGB format) is used.
+

+ +

Each window has a name which is written on its title bar which can be +changed using the rename-window! command. The board can be cleaned +from all drawings using the clear-window command.
+

+ +

Since the board is a bitmap it can be saved to a BMP file using the +save-bitmap command. A new background from a bitmap file can be +loaded using the load-bitmap command.
+

+ +

TURTLES
+

+ +

A turtle is an object which is connected to a certain board. Each turtle +has a pen with which it can draw on that board. The user can change the +state of the turtle's pen including giving it the color of the board's +background color (using the pen-erase! command). The pen will draw +when it is "down" and will not draw when it is "up". +Turtles can move between boards using the move-turtle-to-window +command.
+

+ +

Each turtle holds its location as the a pair of coordinates where 0,0 +is the upper left corner of the board and 800,600 is the bottom-right corner +of the board. The turtle's location can be changed by giving the turtle +commands such as forward!, backwards!, move-to! or by using the +move button from the toolbar.
+

+ +

A turtle also has a heading which is the direction it will move on the +forward! command. The heading is in degrees, 0 meaning upwards and +increasing clockwise, thus 90 means rightwards and so on. A turtle's heading +can be changed by commands such as right!, left!, and set-heading! +or interactively, by using the move button on the toolbar and pressing +the control key.
+

+ +

A turtle can be visible on the board or be hidden. When it is visible +the user can decide if it wants a "solid" or "hollow" +turtle using the make-hollow! and make-solid! commands.
+

+ +

A turtle is always connected to a certain board, which is the board +it is drawing on. To create a new turtle on a board use the make-turtle +or the clone-turtle commands. A new turtle (created with the make-turtle +command) will be black, solid, heading north and with it's pen down, in +the center of the board. A cloned turtle will have exactly the same inner +state as its parent.
+

+ +

A turtle can also look at the board and see other turtles or colors. +By using the command look the user can tell the turtle the area +in which to look and what to look in this area.

+ +

Example:

+ +

The command

+ +

(look t 50 20 '(0 0 0))

+ +

will cause the turtle t to look for black pixels in the area +in radius 50 from the turtle and 20 degrees to each side of the heading +line, shown here in blue:

+ +


+

+ +

INTERRUPTS (NOTIFICATIONS) +AND MESSAGE HANDLERS
+

+ +

A turtle can have interrupts. Each interrupt is defined in terms of +turtle's vision. Whenever a turtle starts or stops seeing a given target, +a predefined message is sent to the thread which asked the interrupt. The +user can determine if the interrupt will notify on every change (like a +"can see"- "can't see" toggle) or only when one change +happens (only "can see" or "can't see" toggle). A message +can be any valid SCHEME object.
+

+ +

Example:

+ +

The command

+ +

(turtle-notify t "I-see" "I-don't-see" 50 20 +color-black)

+ +

tells the turtle t that every time it sees the color black it +should send the message "I-see" and when it doesn't see +the color black any more it should send the message "I-don't-see". +

+ +

Below is an example of what messages (or no message) t will send +while it is moving forward, encountering two black lines on its way:
+
+
+

+ +


+
+If the interrupt was of kind "can see" (notify-when command) +only the "I-see" messages were sent, and if it was a the +"can't see" interrupt (notify-when-not command) only the +"I-can't-see" style messages were sent.
+

+ +

A special "user interrupt" is invoked when the user right-clicks +the turtle or a window. The notify-on-click command is used to enable +this.
+

+ +

A thread can tell the turtle to delete a certain interrupt using the +turtle-no-notify command. It can also tell the turtle to disable +all interrupts using the stop-notifying command.
+

+ +

In order to process the messages sent from a turtle's interrupt (or +from another thread, as presented later) the thread must install a message +handler which is a one argument function. If no handler is installed +the turtle's messages are lost. There can be only one handler per thread. +If the handler is installed then every time an interrupt is invoked, the +handler function in called with the message sent by the interrupt as its +argument.
+
+

+ +

Example:

+ +

We declare the function:

+ +

(define (my-print x) (write x) (newline))

+ +

and then install my-print as the current handler with:

+ +

(install-handler my-print)

+ +

from now on every message a turtle's interrupt sends will be printed +on screen. If my-print was installed in the previous example then +we would have seen:
+

+ +

"I-see"

+ +

"I-don't-see"

+ +

"I-see"
+

+ +

on the screen.
+

+ +

A good example to view the interrupts in action is to make a turtle +turn each time it sees a color and then let it wander aimlessly. Then use +the user pen to draw lines the turtle's way and watch it change direction. +See the PINGPONG.SCM file for a demo program.
+

+ +

The message-handler concept can be used as a mean of synchronous inter-thread +communications. The tell-thread functions sends a message to a thread, +which will be treated as an interrupt-generated message: It will cause +the thread's message handler function to be called with tell-thread's argument +as its own. This allows one thread to initiate a computation in a different +thread's environment and CPU space synchronously and without sharing environments. +
+

+ +

MESSAGE QUEUES
+

+ +

In order to let threads communicate between themselves asynchronously +a system of message queues was developed. A queue is an object which stores +and relieves messages, stored in FIFO (First In First Out) style, meaning +messages are read in the order of arrival to the queue. Supported messages +are pairs of type and body, both of which can be any valid SCHEME object. +Looking for messages of a certain type is also supported, allowing implementation +of more flexible communication schemes than plain FIFO.
+

+ +

A thread can check if there are any messages in a given queue, if it +does get-message without checking first if there are messages in +the queue it will wait a given time-out or forever if no time-out is given. +If by the end of the time-out no message were in the queue the result will +be false.
+

+ +

Example:

+ +

In this example a queue q is created then a message is posted +into the queue and read from it.
+

+ +

(define q (make-queue))

+ +

(post-message q (cons 'type-circus 'bozo-the-clown))

+ +

(define msg (get-message q))
+

+ +

now the command

+ +

(car msg)

+ +

will give

+ +

type-circus

+ +

and the command

+ +

(cdr msg)

+ +

will yield

+ +

bozo-the-clown.

+ + +

+


+
+ [TOP] + [PREV] + [PREV] + [PREV] +
+ + + + + + diff --git a/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970806122632/~elad/GALAPAGOS/gui.html b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970806122632/~elad/GALAPAGOS/gui.html new file mode 100644 index 0000000..a6c0244 --- /dev/null +++ b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970806122632/~elad/GALAPAGOS/gui.html @@ -0,0 +1,73 @@ + + + + Galapago - GUI + + + + + +
+ [PREV] + [PREV] + [PREV] +
+
+

+ +

THE INTERACTIVE GUI

+
+

In order to make Galapagos more fun to learn with, an interactive GUI +(Graphical User Interface) is provided. Users can make changes on the board +while a computation is in progress and effect its execution. Drawing tools +enable the user to draw on the board while a program is being executed. +If a line is drawn in front of a turtle which has a relevant interrupt, +the interrupt will be invoked if needed.
+

+ +

The user has a special user pen that can draw line, rectangles +or free hand. These modes are available from the toolbar. The User's pen +width and color can be modified using the User Pen menu or the toolbar.
+

+ +

Color buttons are provided on the toolbar to give a known RGB color +to the user pen. It is useful when the user draw an object on the board +and wants a turtle to see this object. The colors are:

+ +

White - (255 255 255)

+ +

Black - (0 0 0)

+ +

Blue - (0 0 255)

+ +

Red - (255 0 0)

+ +

Green - (0 255 0)

+ +

Yellow - (255 255 0)
+

+ +

Another option available is changing a turtle's heading and position, +using the Move Turtle button:

+ +


+

+ +

If this button is pressed then a turtle can be dragged to a new location +simply by dragging it with the mouse. In order to change the turtle's heading, +hold down a control key and move the move towards the desired location, +the turtle will follow the movement of the mouse.

+ +

+


+
+ [TOP] + [PREV] + [PREV] + [PREV] +
+ + + + + diff --git a/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970806122650/~elad/GALAPAGOS/implementation.html b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970806122650/~elad/GALAPAGOS/implementation.html new file mode 100644 index 0000000..822f9b9 --- /dev/null +++ b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970806122650/~elad/GALAPAGOS/implementation.html @@ -0,0 +1,393 @@ + + + + Galapagos - Implementation + + + + + +
+ [PREV] + [PREV] + [PREV] +
+
+

+ +

IMPLEMENTATION

+ + + +
+

Galapagos was written using Microsoft Visual C++, and is designed to +run under Windows 95. We chose Windows 95 because it seems to have the +largest potential Galapagos users base. The following sections describe +some implementation details of Galapagos.
+

+ +

The SCM interpreter we used as a base is written in C. Most of the original +code we added was written in C++. The parts we used from SCM are almost +identical to the original. In fact, by changing the scmconfig.h file (which +contain machine-specific configuration) and #defining THREAD to be null, +the C files should become equivalent to the sources we used.
+

+ +

We have implemented two MT-safe FIFO message queue classes. Both will +block when trying to read from an empty queue. CMsgQx, the extended +message queue, supports the same interface as the one provided in Scheme, +plus an additional support for "Urgent Messages". These take +precedence over all other messages. CMessageQueue is message queue +with exactly the same interface as the Scheme level message queues, but +which contain internal logic to handle "Urgent" messages used +to deal with cases where synchronous respond is needed, such as I/O, Garbage +collection, and Scheme-level inter-thread communications.
+

+ +

FITTING SCM INTO WINDOWS
+

+ +

Galapagos is based on SCM, which is a single-thread, read-evaluate-print-loop +(repl) based Scheme interpreter. The most important issue in migrating +SCM was how to maintain the interpreter's natural repl-based approach, +yet allow for multiple threads to interact, and for Windows messages to +be processed quickly.
+

+ +

We used WIN32's multithreading capabilities to solve these problems. +A single thread handles all aspects of the GUI - in a sense, "all +that is Windows": graphic boards, turtles, consoles, menus and so +on. Each interpreter runs in a thread of its own, interacting with the +GUI using a message queue similar to the one provided at the Scheme level.
+

+ +


+

+ +

The GUI thread manages both commands received from the OS and from the +different interpreters running on their own threads. To ensure as fast +responses as possible, priorities are used: OS messages (such as windows +updates and input devices) gets highest priority; Console (text messages) +come second, and graphics messages are last. This allows the interpreters +to run interactively in a satisfactory manner.
+

+ +

SCM interpreter threads each run in the old-fashion repl mode. When +a computation is over, the interpreter blocks until new input comes from +the GUI thread. All blocking functions were modified to allow synchronous +messages (such as the one generated by tell-thread) to work. In +addition, SCM's "poll routine" is used to force checking for +such messages even during computations.
+

+ +

An additional thread is used for Garbage Collection. It is described +in detail in the section dealing with garbage collection.
+

+ +

GARBAGE COLLECTION

+ +

In this section we will briefly describe SCM's garbage collector, and +then discuss the modifications done to adapt it to Galapagos's multithreading +computations. It should be noted that the garbage collector used is a portable +garbage collector taken from "SCHEME IN ONE DEFUN, BUT IN C THIS TIME", +by George J Carrette <gjc@world.std.com>.
+

+ +

SCM uses a conservative Mark & Sweep garbage collector (GC). All +Scheme data objects share some common configuration (called "cells"): +They are 8-byte aligned; they reside is specially-allocated memory segments +(called hplims); they are the size of two pointers (so a scheme cons is +exactly a cell); and they contain a special GC bit used by the garbage +collector. This bit is 0 during actual computations. When a new cell is +needed and all the hplims are used, garbage collection is initiated. If +it does not free enough space to pass a certain threshold, a new hplim +is allocated.
+

+ +

The first stage in garbage collection is marking all cells which are +not to be deleted. Some terminology might be helpful here:
+

+ +
    +
  • A cell (or any data object) is called alive if it may +in some way influence the future of the computation. Needless to say, discovering +which cells are alive and which are not is impossible, because of the very +nature of the future.
  • +
+ +
    +
  • A cell is called reachable if the computation can read +its value. Some data is immediately reachable: The data on the machine's +stack or in the CPU registers, for example; some interpreters store some +information in a fixed location so it's permanently reachable. In SCM the +array sys_protects[] is used for +this propose. The set of reachable cells is the union of all immediately +reachable cells, and all those cells pointed by reachable cells, recursively. +
  • +
+ +

Obviously, all unreachable data is dead. Conservative garbage collectors +treat all reachable data as alive.
+

+ +

The Mark stage of the garbage collector scans the sys_protects[] +array and the machine's stack and registers for anything that looks like +a valid cell. All cell pointer have their 3 least significant bits zero, +and are in one of few known ranges (the hplims). The garbage collector +searches for anything matching a cell's bit pattern, and treats it as an +immediately reachable cell pointer. In some cases, this may mean an integer, +for example, happens to match the binary pattern and thus be interpreted +as a cell pointer. However, this will only mean some cell or cells are +marked as reachable though they are not such. Because of the uniform structure +of the cell and its limited range of possible locations, such an accident +is guarantied not to corrupt memory. Furthermore, if we accept the assumption +that integers are usually relatively small, and memory addresses are relatively +big, we conclude that such accidents are not very likely to happen often +anyway.
+

+ +

During mark stage, the garbage collector recursively finds (a superset +of) all live cells, and marks them by setting their special GC bit to 1. +The second stage is the Sweep stage, in which all the hplims are scanned +linearly, and every cell which is not marked is recognized as dead, and +as such is reclaimed as free. Marked cells get unmarked so they are ready +for the next garbage collection.
+

+ +

Mark & Sweep garbage collection has two main disadvantages: One, +that it requires all computation to stop while garbage collection is in +progress. In Galapagos, since all threads use a shared memory heap, it +means all threads must synchronize and halt while garbage is collected. +Second, Mark & Sweep is very likely to cause memory fragmentation. +However, since cells are equally sized, fragmentation is only rarely a +problem.
+

+ +

We chose to stick with Mark & Sweep in Galapagos because of its +two major advantages: Simplicity and efficiency. Mark & Sweep GC does +not affect computation speed, because direct pointers are used. Most concurrent +garbage collectors work by making all pointers indirect, which may slow +computations down considerably. The need to halt all threads for GC is +accepted. Since memory is shared, it would only be fair to stop all threads +when GC is needed: Threads will probably halt anyway since cells are allocated +continuously during computations.
+

+ +

Two major issues are introduced when trying to multithread the garbage +collector. One is the synchronization of the different threads, which run +almost completely unaware one of the other; the second is the need to mark +data from every thread's specific stack, registers, and sys_protects[]. +We solved these two issues by combining them to one.
+

+ +

The intuitive approach might be to let each thread mark its own information, +and then sweep centrally. However, since synchronization of threads is +mandatory, letting every thread mark its own data will lead only to redundant +marking and to excessive context switches, since each threads has to become +active. Therefore we created the "Garbage Collection daemon" +(GCd), which runs in a distinct thread and lasts for the whole Galapagos +session. The GCd is not an interpreter, but a mechanism which keeps track +of live threads and their need of GC. The GCd thread is always blocked, +except when a thread notifies it on its birth or death, or when a thread +indicates the need for garbage collection. Since the GC daemon is blocked +whenever it is not needed, and then becomes the exclusive running thread +during actual GC (with the exception of the GUI thread), its existence +does not hurt performance.
+

+ +

To explain how the GCd synchronizes all threads, let us examine the +three-way protocol involved. freelist +is a global pointer which holds a linked list of free cells - it can be +either a cell pointer, a value indicating "busy" (thus implementing +busy/wait protection over it) or "end of memory" which is found +at the end of the linked list. MIB stands for Memory Information +Block, which is a block of memory containing all of a thread's +immediately reachable data.
+

+ +

GCd scenario: GCd is blocked until a threads sends a GC +request.

+ +
    +
  1. GCd scans through its list of active threads, and sends each a MIB +request.
  2. + +
  3. It then blocks until all MIB blocks are received. GCd ignores further +GC request messages it get.
  4. + +
  5. At this point all threads are blocked. The GCd has gained, therefore, +exclusive access to the hplims. The GCd now marks all reachable cells, +inspecting each MIB block for immediately reachable cells and proceeding +recursively. Then, it sweeps.
  6. + +
  7. If needed, the GCd allocated a fresh hplim.
  8. + +
  9. GCd sends every thread a message allowing it to resume. Then it blocks +waiting for the next time.
  10. +
+ +

Scenario 1: A thread needs to allocate a cell but can't. +

+ +
    +
  1. The thread sends GCd a GC request message.
  2. + +
  3. Then it suspends until GCd sends it an MIB request.
  4. + +
  5. When one arrives, the thread generates and sends a MIB block to the +GCd.
  6. + +
  7. And blocks again until GCd notifies it that GC is done.
  8. + +
  9. At this point free cells are available and the computation can resume. +
  10. +
+ +

Scenario 2: A thread receives a MIB request. This +may happen within a computation or when considered otherwise blocked - +waiting for input, for example.

+ +
    +
  1. The thread generates and sends a MIB block to the GCd.
  2. + +
  3. And blocks until GCd notifies it that GC is done.
  4. +
+ +

The important thing to note about this protocol is its indifference +to the GC "initiator". Several threads can "initiate" +GC, and each request is "satisfied", although of course only +one GC takes place. The GCd itself is unaware of the initiating thread +identity, and completely ignores any further GC requests. It treats all +threads identically. This is important because it allows each thread meeting +a low memory condition to initiate GC immediately. This is in fact the +mechanism which saves us from explicitly checking for a third-party GC +request during computation: If a thread runs out of memory, the freelist +variable is kept at "out of memory" state, causing any other +thread trying to allocate memory to initiate GC as well. This simplifies +the GC protocol (technically, if not conceptually), and does it with almost +no affect on computation speed.
+

+ +

BOARDS
+

+ +

A board or a view as it called in MFC is the environment where a turtle +moves and interact with. It hold two main data structures. The first is +the bitmap of the drawing. It is a 800X600 bitmap. Every time a turtle +draws on the board it makes its pen the active pen on the board and draws +on it. Every time the picture needs refreshing (as signaled by the operating +system) it is the board's duty to copy the relevant section from the bitmap +to the screen. The second data object is the turtles list, an expandable +array of turtles which holds pointers to all turtles on the specific board.
+

+ +

The most important part in the board's work is to notify the turtles +on any event that happened on the board such as drawing, changing background +or moving of a turtle. If for example a user draws a line on the board, +the board (after drawing the line) goes through the turtles list and tell +each one that some event happened at a rectangle that contains the line. +Each turtle will decide if this has any importance to it or not.
+

+ +

Apart from that, the board handles all the user interface from the menus +and the toolbar. The most obvious example is the move turtle button, which, +when pressed, causes the board to find a turtle close enough to the click's +location. Then, on every movement of the mouse it gives the turtle a command +to move to this point.
+

+ +

In order to support scrolling of the picture, we derived the CBoardView +class from CScrollView. The interface with the interpreter threads +is done via a message queue. The main function is ReadAndEval, +which gets a message and then interprets its and act upon the result.
+

+ +

TURTLES
+

+ +

In addition to a pointer to its current board, and to inner-state variable +which affects its graphical aspects, every turtle holds an expandable array +of interrupts. When a turtle gets from the window that a message signifying +that some change has happened, it sends this change to each of its interrupts +(only if the interrupt flag is on) and the interrupt is responsible to +send an appropriate message if necessary. The turtle's location are stored +as floating points on x,y axes, to allow for accuracy on the turtle's location +and heading.
+

+ +

The turtles interacts with the interpreter thread using a message queue. +As with the board, the main function here is the ReadAndEval, +which translates these messages to valid function calls.
+

+ +

VISION
+

+ +

Every turtle holds a pointer to the bitmap it is drawing on. When it +is "looking" for a color it calculates the minimal rectangle +that holds the desired area. Then it iterates on all the pixels in this +rectangle. First it checks if the pixel is in the vision area using the +sign rule to determine if a point is clockwise or anti clockwise from a +line, and then check for distance. If the point is in the relevant area +the turtle gets its color from the bitmap and compares it with the sought +color.
+

+ +

When looking for a specific turtle, the turtle gets this turtle's position +and calculates if this location is in the relevant area using the same +algorithm. When looking for any turtle, the turtle passes the relevant +arguments to the view, which then uses the same algorithm for each turtle +on its turtles array.
+

+ +

INTERRUPTS
+

+ +

Each turtle holds an expandable array of interrupts. Each interrupts +is an object that is much like a turtle vision. The interrupts has the +view area argument and what it is looking for. It also has the message +it needs to send and a pointer to the given queue. When the turtle notifies +the interrupt that a change has happened, the interrupt first checks if +the change is an area which is of interest to it. If so it calls the turtle +look function with its location and the sought object. According to the +turtle's answer and to the data stored inside the interrupt, the interrupt +sends the needed message, if any.
+
+

+ +

CLASS ORGANIZATION
+

+ +


+
+

+ +

Message-passing mechanisms:
+

+ +

+

+ + + +

+


+
+ [TOP] + [PREV] + [PREV] + [PREV] +
+ + + + + + diff --git a/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970806122731/~elad/GALAPAGOS/manual.html b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970806122731/~elad/GALAPAGOS/manual.html new file mode 100644 index 0000000..030d010 --- /dev/null +++ b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970806122731/~elad/GALAPAGOS/manual.html @@ -0,0 +1,1404 @@ + + + + Galapagos - Programmer's Manual + + + + + +
+ [PREV] + [PREV] + [PREV] +
+
+

+ +

PROGRAMMER'S MANUAL:
+NONSTANDARD PRIMITIVES

+ +
+ +

+


+ +

Welcome to Galapagos Scheme. This chapter is intended +as a quick reference to Galapagos's extensions over traditional Scheme. +Knowledge of Scheme is assumed. Galapagos Scheme is compliant with both +R4RS and IEEE standard P1178. If you've read the chapter titled +"Scheme extensions", you can and should skip the short introduction +in each section. This complete chapter appears as on-line help in Galapagos, +just a F1 click away.
+

+ +

+

+ +

ENVIRONMENTS
+

+ +

An environment is a list of frames, +with the global environment in its tail. A frame is a list +of bindings, which map variables to their values. (define...) +adds a binding to the frame at the top of the current environment. +(set!...) family of commands modify +an existing binding, in the frame where it was defined. When a variable +is referenced, the current environment is searched from head to tail, and +the first binding found dictates the value of the variable.

+ +

The first interpreter, which pops up as Galapagos +is started, runs at the global environment (the way traditional Scheme +works). Additional interpreters (threads) run at distinct environments, +which contain a single initially empty frame, and a pointer to the global +environment.
+
+

+ +

(clone-environment +env [depth])
+

+ +

Clone-environment will make an exact copy of the +environment env, by copying its frames +one by one. If depth is specified then the new environment will be the +collection of frames which is up to depth +frames from the current frame. And the last frame will point to the depth ++ 1 frames from the current one in env. +
+

+ +

This means that if we are now in environment e1 +and done (define x 7). Then if we'll +write

+ +

(define e2 (clone-environment +(current-environment))),

+ +

the result of

+ +

(eval@ e2 x) +

+ +

will return 7.
+

+ +

But if we are not in a lower frame than the one +x was defined in and write

+ +

(define e2 (clone-environment +(current-environment) 1))

+ +

and write the value of x is undefined.

+ +

(Unless it was defined in the global environment) +
+

+ +

Note: Only the bindings are copied. The bound values +are not. Example:

+ +

(define x (cons 1 2)) +

+ +

(define e (clone-environment +(current-environment)))

+ +

(eval@ e (set-cdr! X 6)) +

+ +

will change the 2 into 6 at both environments. +However,

+ +

(set! x 7) +

+ +

will only affect one copy.
+

+ +

(pop-environment +env)
+

+ +

Returns the current environment without the first +frame. This means the first frame on the list of frames is "popped" +out.

+ +

If env was +made from f3->f2->f1->Global, the result will be f2->f1->Global. +

+ +

(fx means frame number x)

+ +

Example:

+ +

(define e2 (pop-environment +(current-environment)))
+

+ +

(extend-environment +env)
+

+ +

Extends env with +a new empty frame (where nothing is defined yet).

+ +

This means the if env +was f2->f1->Global the result will be f3->f2->f1->Global. +

+ +

(fx means frame number x)

+ +

Example:

+ +

(define e2 (extend-environment +(current-environment)))
+

+ +

(current-environment) +
+

+ +

Returns the current environment.
+

+ +

(environment? +env)
+

+ +

A predicate that is true if env +is an environment.

+ +

Example:

+ +

(environment? (current-environment)) +

+ +

Will return true.
+

+ +

(parent-environment) +
+

+ +

Returns the parent environment. This is the environment +where (new-thread) was called to create +this thread. The First thread returns the global environment.

+ +

Example:

+ +

(eval@ (parent-environment) +y)

+ +

Will return the value of y in the parent environment.
+

+ +

(base-environment) +
+

+ +

The environment where the interpreter runs.
+

+ +

(set-base-environment +env)
+

+ +

Sets the base environment (where the interpreter +runs) to be env

+ +

Example:

+ +

(set-base-environment +(parent-environment))

+ +

Will make this thread run in the same environment +as its father)
+

+ +

(eval@ env forms...) +
+

+ +

Evaluates forms in given environment.

+ +

Example:

+ +

(define x 7) +

+ +

(define e2 (clone-environment +(current-environment)))

+ +

(eval@ e2 x)
+

+ +

The result will be 7
+

+ +

(eval@p forms...) +
+

+ +

Evaluates forms in parent environment.

+ +

Example:

+ +

Say we want to make our turtle walk 30 degrees +more than the father's turtle. Then we can write:

+ +

(set-heading! T (+ 30 +(eval@p (turtle-heading t))))
+

+ +

MESSAGE QUEUES
+

+ +

Message queues are MT-safe mechanisms used to pass +messages, possibly between threads. Messages accepted must be cons, its +car being the message type and the cdr is the message body. Both can be +any kind of Scheme object.
+
+

+ +

(make-queue) +

+ +

Creates a new message queue.

+ +

Example:

+ +

(define q (make-queue)) +
+

+ +

(message-queue? +q)

+ +

A predicate that is true if q +is a queue.

+ +

Example:

+ +

(message-queue? q)

+ +

Will return true for q from the previous example.
+

+ +

(peek-message +q [type])
+

+ +

Return true if there is a message (of given type, +or of any type if unspecified) in the queue q. +

+ +

Example:

+ +

(peek-message q) +

+ +

Will return falsif the queue q is empty. +

+ +

Note: types are compared using (equals?) +.
+

+ +

(post-message +q typ_msg)
+

+ +

Posts the message typ_msg +to the queue q.

+ +

typ_msg must +be a cons (type . message).

+ +

Example:

+ +

(post-message q (cons +'type-welcome 'hello))
+

+ +

(get-message [time-out] +q [type])
+

+ +

Get message from queue q +, if time-out is defined +waits only time-out seconds, and

+ +

optionally gets only messages from type type. +

+ +

Example:

+ +

(define msg (get-message +7 q 'type-welcome))

+ +

The result will be (if the previous posting was +done) ('type-welcome . 'hello)

+ +

Note: types are compared using (equals?) +.
+

+ +

WINDOW COMMANDS
+
+

+ +

A window is the graphical board on which the turtles +and the user draw. It is a bitmap of size 800x600.
+
+

+ +

(new-window [name]) +
+

+ +

Makes a new window, name +is a symbol or a string which will also be the window's title. The window's +color will be white and it's size 800x600.

+ +

Example:

+ +

(define w (new-window +'my-window))

+ +

Will create a new window with the title my-window. +
+

+ +

(rename-window! +win [name])
+

+ +

Renames the window win. name +is a symbol or a string which will also be the window's title.

+ +

Example:

+ +

(rename-window! w 'foo) +

+ +

Will make the title of w to be foo.
+

+ +

(set-background-color! +R G B)
+

+ +

Set the background color of the window. All the +turtles in the window are notified on the new color (used in pen-erase) +

+ +

The colors are defined in terms of Red +Green Blue +(where 0,0,0 is black and 255,255,255 is white).

+ +

Example:

+ +

(set-background-color! +w 255 255 0)

+ +

Will turn the background color of w +to yellow
+

+ +

(clear-window +w)
+

+ +

Clears the screen from all the previous drawings, +leaving only the turtles images on it.

+ +

Example:

+ +

(clear-window w)
+

+ +

(load-bitmap w +"filename" [x y])
+

+ +

Loads the bitmap "filename" +and makes it the background of w. x y are +the coordinates of the upper left corner of the picture. If x +y are not given then the picture is centered.

+ +

Example:

+ +

(load-bitmap w "c:\\windows\\forest.bmp") +
+

+ +

This operation can also be done using the Board +menu.
+
+

+ +

(save-bitmap w +"filename")
+

+ +

Saves the window into a bitmap file called "filename". +

+ +

Example:

+ +

(save-bitmap w "my_draw.bmp") +
+

+ +

This operation can also be done using the Board +menu.
+

+ +

(window-alive? +win)
+

+ +

True if win +is alive, meaning it can get commands.
+

+ +

(window-name w) +

+ +

Returns the name of w. +

+ +

Example:

+ +

(window-name w) +

+ +

Will return "foo" on our window.
+

+ +

TURTLE COMMANDS

+ +

A turtle is an object which is connected to a certain +window. It has inner state variables:
+

+ +

- width: the width +of the pen.

+ +

- heading: the direction +the turtle will go on command forward!. +The heading is in degrees where 0 is upwards and adding to the heading +means clock wise rotation.

+ +

- visibility: if the +body of the turtle is visible on the board or not.

+ +

- solid: if the turtle +is a "solid" turtle (its interior is also drawn) or "hollow" +one (only its circumference is drawn).

+ +

- position: the location +of the turtle on the board, where 0,0 is the upper left corner. +

+ +

- color: the color +of the turtle and it's pen, given in RGB format.

+ +

- pen condition: the +turtle's pen can be in three states:

+ + + +

- pen width: the width +of the pen, the bigger the width the thicker the pen will be.
+

+ +

Turtles can also "see" the board or other +turtles (only from the same board) and can handle user interrupts. A turtle +is always connected to a certain view, which is the view it is drawing +on. Turtles can move between views.
+
+

+ +

(make-turtle win +[name])
+

+ +

Creates and return a new turtle, in window win, +optional name (where name can be anything). +

+ +

The inner state of the new turtle will be: +

+ + + +

Example:

+ +

(define t (make-turtle +'turty))
+

+ +

(turtle-alive? +t)
+

+ +

A predicate that is true if t +is alive, meaning t can get commands. +

+ +

Example:

+ +

(turtle-alive? t)

+ +

Will return true on our t.
+

+ +

(clone-turtle +t [name])
+

+ +

Creates an identical turtle to t +(same inner state).

+ +

Example:

+ +

(define t2 (clone-turtle +t))
+

+ +

(rename-turtle +t [name])
+

+ +

Renames the turtle, name is a string or a symbol +

+ +

Example:

+ +

(rename-turtle t 'pongy) +
+

+ +

(turtle-name t) +
+

+ +

Returns the name of t. +

+ +

Example:

+ +

(turtle-name t) +

+ +

Will return "pongy" on our t.
+

+ +

(forward! t d)
+

+ +

Makes t go +forward (in the heading of t) +d steps. +t will draw while going according to +the state of it's pen.

+ +

Example:

+ +

(forward! t 100) +

+ +

Will cause t +to go forward 100 steps. (In our case since t's +heading hasn't changed it will go upwards)
+

+ +

(turtle-width! +t n)

+ +

Set the width of t's +pen to be n. The bigger n +is the wider the pen will be.
+

+ +

(backwards! t +d)
+

+ +

Same as forward, just in the opposite direction. +

+ +

Example:

+ +

(backwards! t 100) +

+ +

is the same as

+ +

(forward! t -100)
+

+ +

(right! t d)
+

+ +

Will set a new heading to t. +The new heading is the old heading plus d, meaning +t will rotate clock-wise.

+ +

Example:

+ +

(right! t 90) +

+ +

Will make t +turn 90 degrees to the
+

+ +

(left! t d) +

+ +

Same as right, other direction
+

+ +

(set-heading! +t val)
+

+ +

Sets the heading of t +to be val. 0 is upwards and 90 is to +the right.

+ +

Example:

+ +

(set-heading t 180) +

+ +

Will cause t +to point to the bottom of the screen.
+

+ +

(move-to! t x +y)
+

+ +

Makes t move +to point x,y without painting. 0,0 +is the top-left corner of the window.

+ +

Example:

+ +

(move-to! T 100 100) +

+ +

Will cause t +to move to point 100,100.
+

+ +

(draw-to! t x +y)
+

+ +

Moves t to +x,y possibly drawing or erasing according +to the state of t's pen.

+ +

Example:

+ +

(draw-to! t 0 0)
+

+ +

(move-turtle-to-window +t win)

+ +

Move t to the +window win

+ +

Example:

+ +

(move-turtle-to-window +t w)
+

+ +

(pen-up! t)
+

+ +

The pen of t +is up, so he won't paint when moving.

+ +

Example:

+ +

(pen-up! t)
+

+ +

(pen-down! t)
+

+ +

Causes t's +pen to be down, meaning he will draw as he is moving.
+

+ +

(pen-erase! t)
+

+ +

Causes t's +pen to be in the same color as the background color of the window it is +attached to.
+

+ +

(show-turtle! +t)
+

+ +

Makes t visible. +Meaning he will be seen on the board.

+ +

Example:

+ +

(show-turtle! t)
+

+ +

(hide-turtle! +t)
+

+ +

Makes t invisible. +Meaning he will not be seen on the board. (but all the drawing he does +will be seen)

+ +

Example:

+ +

(hide-turtle! t)
+

+ +

(make-turtle-solid! +t)
+

+ +

Makes t a solid +turtle.
+

+ +

(make-turtle-hollow! +t)
+

+ +

Make t a "hollow" +turtle.
+

+ +

(kill-turtle! +t)
+

+ +

Kills t. Meaning +it will be erased from the board and will not accept further commands. +

+ +

Note: This is the only way to get rid of a turtle. +

+ +

Example:

+ +

(kill-turtle! t) +

+ +

Will cause when writing t +in the command line to the response

+ +

#<dead turtle>
+

+ +

(set-color! t +R G B) or (set-color! t (list R G B)
+

+ +

Sets t's color +(and it's pen), in RGB format.

+ +

Example:

+ +

(set-color! t 255 0 255) +

+ +

Will cause t +to be pinkish.

+ +

Same as:

+ +

(define pinkish '(255 +0 255))

+ +

(set-color! t pinkish)
+

+ +

(turtle-inner-state +t)
+

+ +

Returns a list of 6 parameters: color, heading, +hidden-flag, pen width, solid flag, location (cons x y))

+ +

Example:

+ +

(define new-t (make-turtle +w))

+ +

(turtle-inner-state new-t) +

+ +

Will return the list

+ +

((0 0 0) 0.0 #f 2 #t (400.0 +. 300.0))
+

+ +

Below are functions that returns only one of the +parameters returned by turtle-inner-state: +
+

+ +

(turtle-color t) +

+ +

(turtle-heading t) +

+ +

(turtle-visible t) +

+ +

(turtle-width t) +

+ +

(turtle-solid? t) +

+ +

(turtle-position t)
+

+ +

TURTLE VISION
+

+ +

A turtle can interact with the board. It can "see" +colors or other turtles.
+
+

+ +

(look t distance +angle '(R G B))
+

+ +

Will return true if there is a point in color (R +G B) in distance distance from +t and in the area bordered by the angle +2*angle.

+ +

Example:

+ +

(look t 50 20 '(0 0 0)) +

+ +

Will cause t +to search for the color black (RGB 0,0,0) in the area shown here in blue:
+

+ +


+

+ +

(look t distance +angle [t1])
+

+ +

Same as if looking for color, just this time it +will be true is t1 is in the visible area.

+ +

If no target turtle is defined then the function +will return true if any turtle from this window is in the visible area. +

+ +

Example:

+ +

(define new-t (clone-turtle +t))

+ +

(forward! new-t 30) +

+ +

(look t 50 20 new-t) +

+ +

And

+ +

(look t 50 20) +

+ +

Will both return true.
+
+

+ +

INTERRUPTS (NOTIFICATIONS) +
+

+ +

A turtle can hold a list of interrupts (or notifications). +When an interrupt is invoked it send a given message to the thread that +sent the command. Every interrupt is defined by a "look" arguments. +An interruptcan be of three kinds:
+

+ +

A "yes" interrupt - The interrupt will +happen (message sent) on every "first" time the look returns +yes.

+ +

Meaning if a turtle is told to invoke an interrupt +every time it sees blue on a certain region. Then the first time it sees +blue it will invoke the interrupt. From now on if the blue is in view it +will not invoke the interrupt. Then if it loses sight of the blue object, +the next time it sees blue again it will invoke the interrupt, and so on.
+

+ +

A "no" interrupt - Same as the "yes" +interrupt, just this time the interrupt is invoked when the sought object +is not seen.
+

+ +

A "both" interrupt - First time the sought +object is viewed the "yes" message is sent, then the first time +the turtle loses sight of the object the "no" message is sent +and so on.

+ +

A message can be any SCHEME object.
+

+ +

When the interpreter is installing interrupt to +a turtle it need to install a handler, which is a function that +takes only one argument and this argument is the messages that comes from +the interrupt.

+ +

If no handler is installed, the messages will be +sent but will have no affect on the thread of execution.

+ +

There can be only one handler per thread and a +handler can not be a primitive procedure.
+

+ +

(turtle-notify +t msg1 msg2 distance angle TARGET)

+ +

Instructs a turtle to send msg1 and msg2 upon seeing +and not seeing, respectively, the target. The messages can be any Scheme +objects, which are sent to the thread as if by (tell-thread). The other +parameters - see (look)

+ +

Example:

+ +

(turtle-notify t 'yes +'no 50 10 new-t)

+ +

This is a "both" kind interrupt.
+

+ +

(turtle-no-notify +t distance angle TARGET)
+

+ +

Tells the turtle to stop notifying in the given +case. Very like deleting the interrupt from the turtle.
+

+ +

(notify-when[-not] +t1 msg dist ang TARGET)
+

+ +

Instructs a turtle to send msg upon [stopping] +seeing the target. This is a "yes" or "no" interrupt. +

+ +

Example:

+ +

(notify-when t 'gotcha +50 10 new-t)

+ +

Will cause t +to send the message "gotcha" every "first" time it +sees new-t.
+

+ +

(stop-notifying +t)
+

+ +

t will temporarily +stop notifying on interrupts. Like "clear interrupts".
+

+ +

(continue-notifying +t)
+

+ +

t will resume +notifying on interrupts.
+

+ +

(no-notifications +t)

+ +

Deletes all t's +interrupts.
+

+ +

(notify-on-click +turtle msg)
+

+ +

Instructs turtle to send msg when right-clicked +with the mouse (distance of 5 pixels from the turtle location). There can +be only one interrupt of this kind per turtle.

+ +

Example:

+ +

(notify-on-click t 'ouch) +

+ +

Will case t +to send the message "ouch" when the user right-clicks next to +it.
+

+ +

(notify-on-click +window msg)
+

+ +

Instructs window to +send msg when right-clicked with the +mouse not close to any turtle.
+

+ +

(clear-notify-click +t)
+

+ +

Clears the user right click interrupt
+

+ +

(install-handler +func)
+

+ +

Installs a message handler. When a message arrives, +func is called with it as a sole argument. +

+ +

There can be only one handler per thread. func +can not be a primitive procedure.

+ +

Example:

+ +

(define (print x) (write +x))

+ +

(notify-on-click t 'click-on-t) +

+ +

(install-handler print) +

+ +

Will cause that the message "click-on-t" +will be printed each time the user right clicked on t. +
+

+ +

THREADS
+

+ +

Galapagos supports multiple threads. Every thread +is a complete Scheme interpreter, with its own base environment. Every +thread has a Thread Object, which uniquely identifies it.
+

+ +

A console is a text window where the user +can type commands (when the interpreter is idle) and see output. A thread +may or may not be bound to a console. Information printed by a non-bound +thread is lost; a non-bound thread waiting for input is stuck (unless provisions +were made to allow a new console to be created by means of inter-thread +communications.) If a non-bound thread has nothing to do, instead of waiting +for input like a bound thread, it will terminate.
+

+ +

(this-thread)
+

+ +

Returns the thread-object of the current thread. +

+ +

Example:

+ +

(this-thread) +

+ +

Will return something like

+ +

#<thread 0x6d1e2c> +
+

+ +

(is-first-thread?) +
+

+ +

True if the current thread is the first SCM thread.
+

+ +

(thread? t) +

+ +

True if t is a thread

+ +

Example:

+ +

(thread? (this-thread)) +

+ +

Will return true
+

+ +

(active-threads) +
+

+ +

Returns the number of active threads
+

+ +

(new-thread form+) +

+ +

Creates a new thread that will calculate the form[s] +

+ +

Example:

+ +

(new-thread (define t +(make-turtle w)) (forward! t 200))

+ +

Will make a new thread that will create a new turtle +and will move it forward 200 steps and then terminates.

+ +

(new-thread (bind-to-console)) +

+ +

Will make a new thread that's ready to accept commands +form a newly-created window. The same can be achieved by selecting "Fork" +from "Scheme" menu.
+
+
+

+ +

(break& form+) +
+

+ +

Causes the current thread to stop and calculate +the form[s]. The current computation is lost.
+

+ +

(bind-to-console) +
+

+ +

The thread will get its commands from a console. +

+ +

Example:

+ +

(new-thread (bind-to-console)) +

+ +

Will create a new thread that gets it.
+

+ +

(unbind-console) +

+ +

Close bound console.
+

+ +

(rename-console +name)

+ +

New name for the current console
+

+ +

(install-handler +func)
+

+ +

Installs a message handler. When a message arrives, +func is called with it as a sole argument. +

+ +

There can be only one handler per thread. func +can not be a primitive procedure.

+ +

Example:

+ +

(define (print x) (write +x))

+ +

(notify-on-click t 'click-on-t) +

+ +

(install-handler print) +

+ +

Will cause that the message "click-on-t" +will be printed each time the user right clicked on t. +

+ +

Note: (new -thread (install-handler +f)) is a bad idea, because the fresh thread will terminate immediately. +
+

+ +

(tell-thread th +x)
+

+ +

Sends message X +to thread th. Returns true on success. +

+ +

If th has no +handler installed it will cause nothing.
+

+ +

(quit-thread)
+

+ +

Kills the current thread, does not work on the +main thread.
+

+ +

(quit-program)
+

+ +

Quits the program.
+
+
+

+ +

These are primitives taken from SCM, which were +modifies to be multithread-safe: + +

+ + +

+An arbiter +is a data object the canbe used as a +guard for critical sections. It can be either "locked" or "unlocked". It +is ideal when a busy/wait mechanism is required, since it is MT-safe. +

+ + +

(sleep n) +

+ +

Causes the current thread to block for (approximately) +n seconds. (sleep 0) is a way to instruct +a thread to give up its remaining processor time.
+

+ + +

(make-arbiter +name)
+

+ +

Makes an arbiter called name. +

+ +

Example:

+ +

(define x-arb (make-arbiter +'x-guard))
+
+

+ +

(try-arbiter arb) +
+

+ +

Checks if the arbiter arb +is up. If the arbiter is up returns false, otherwise it sets +the arbiter to be "up" and returns true.

+ +

Example:

+ +

(try-arbiter x-arb) +

+ +

Will return true and set x-arb +to be "up". But trying it for the second time return false since +x-arb is "up".
+

+ +

(release-arbiter +arb)
+

+ +

Set the arb +to be "down". If the arbiter was "up" returns true +otherwise returns false.

+ +

Example:

+ +

(release-arbiter x-arb) +

+ +

Will return true , but using this function again +will return false since x-arb is already +down.

+ + +

+


+
+ [TOP] + [PREV] + [PREV] + [PREV] +
+ + + + + diff --git a/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970806122740/~elad/GALAPAGOS/bib.html b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970806122740/~elad/GALAPAGOS/bib.html new file mode 100644 index 0000000..52609ac --- /dev/null +++ b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970806122740/~elad/GALAPAGOS/bib.html @@ -0,0 +1,81 @@ + + + + Galapagos - Bibliography + + + + +
+ [PREV] +
+
+

+ +

BIBLIOGRAPHY

+
+ +
    +
  • The +SCHEME FAQ,
    +http://www.cs.cmu.edu:8001/Web/Groups/AI/html/faqs/lang/scheme/top.html +
  • + +

  • The LOGO FAQ,
    +ftp://cher.media.mit.edu/pub/logo/FAQ +
  • + +

  • SCM manual version 4e4, Aubrey Jaffer. SCM 4e4 is available +at:
    +ftp://ftp-swiss.ai.mit.edu/pub/scm/scm4e4.tar.gz +
  • + +

  • Structure and interpretation of computer programs, +Harold Ableson and Gerald J. Sussman with Julie Sussman. +
  • + +

  • Garbage Collection, Andrew W. Appel; appeard +in Topics in Advanced Language Implementation, edited by Peter Lee.
  • +

+ +

+


+

LINKS

+

+

+

+

+


+
+ [PREV] +
+ + + + + diff --git a/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032301/~elad/GALAPAGOS/index.html b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032301/~elad/GALAPAGOS/index.html new file mode 100644 index 0000000..56faa74 --- /dev/null +++ b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032301/~elad/GALAPAGOS/index.html @@ -0,0 +1,95 @@ + + + + Galapagos + + + +

Welcome to
+GALAPAGOS

+ +Galapagos is an interactive multithreaded Scheme interpreter with turtle +graphics for Windows 95. It is built around the SCM interpreter, and it +provides multiple interpreters, threads, turtles, and drawing boards, all +running concurrently using WIN32's multithreading abilities, and freely +available. + +

+


+

+

+

+Spring 1997

+Graduation project

+Department of Math & Computer Science,

+Ben-Gurion University of the Negev

+
+Written by Elad Eyal and Miki +Tebeka.
+
+Supervisor: Dr. Michael Elhadad +
+

+

+


+

+ +

TABLE OF CONTENTS

+ + + +

+ +
+ +

DOWNLOAD CENTER

+

+

GNU LICENSE. COPYRIGHTED. PROVIDED "AS IS". NO +WARRANTIES OR LIABILITIES. ETC.
+

+

+500K gps10bin.zip - Executable and required Scheme libraries (SLIB)
+700K gps10src.zip - Same with all source code
+400K mfc40dll.zip - You might need this MFC40.DLL if you +don't have it already.
+ + diff --git a/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032310/~elad/GALAPAGOS/prev.gif b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032310/~elad/GALAPAGOS/prev.gif new file mode 100644 index 0000000000000000000000000000000000000000..3c3db6dc4f4f25338a24941a9e6301f72545fc6a GIT binary patch literal 752 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 B=2rj! literal 0 HcmV?d00001 diff --git a/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032339/~elad/GALAPAGOS/back.gif b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032339/~elad/GALAPAGOS/back.gif new file mode 100644 index 0000000000000000000000000000000000000000..e0394b7f56d39d0f061d5d34260bfb7c0c6e2134 GIT binary patch literal 1543 zcmdUu`#01H7{;H`@EsZE+s)A_n)tjyojtq%!#?Nz<^AD(-_P@$^KN%`vf1d*0}oU9 zM@sh2ol>c^y1IH`U{;w6rBYQ&!~ua&ivbQXx5dclp?NQ31uy{O4G;=^3&aAUJVXM) zKoA{#z(5-&02_$FHa1s-Z!hy7BlnYFv$6w)ReS;b2~eQ1X@;@+2qY1~LXz~%0UQRH1WS%28(1?UxuC0hCS-Dm zhQqda-Do8L%$e)8q0`(k7 zf&@PkJO#xAUFCtN8dA^`0VN=!A%q7JkQ!N`#5NJlM8Hcpc|bxknT%Sw!)~ISq%@gu z9|J~ANhE4Q8Gt-JBTGURpn%>58W(#s0dIhzrmqU?OUT$QkjhYjTMdm&VUJ_1`hAx?cmX&oWdh6%MhV1(B;RQ`w zhvhama_WCD-JS1KU!2=`X_cll)43$CDQ%sz4q0Dv`*HS{C+5F1BTcqnwL5L@+u#|} znxmh+smi%D%=M@32i;2>N-a7?>Zx)1-V?)IG1cB_of3PeM`GC>wgi$wmx_=(3%eR6 zMZMLD2l})#I?Vm589GFn?OyS|Iy#nfnTLz~YHi0ok}YRs{S9=hW$MH61b(Hoo>&3G2s0T&Y z?{k_D#l`eDuK5(O;$5Znl%k{k>y4!J@XTPI-T36@>P>%jjLcOY&^lW3=LGTxy`$!u z0xu^_ua58it}}VVzVMIw4B5%W8Vm!q#U7?Fyt;ppTz9+wjm?b+R$tH;f@99cei4r@ zbA2LPzLM-e_B5Ki@8mkC&J3FLLwP`a!jio{e5EF%|CBXHBRg_vV#p|EwnF5axI@>h z?|Ypd#?9lt2Os{P?)Qfv_u|@^*RRjNIcJu8+H>L3fsC-Q(7v?D+3D5SqK&&(o)2o6 zHokJWIj8@09%m-_L`wZk-KR{hwYc80 zYCvjHST#2}93g5cPI+HGUgqsl;pzL#qioRKm0kO`ZD~P``ic>D&FH85fif*gV^Q7c ztao&6Z{f2Kvaz>w(GM0ZG9N25Sf5&0r=jIl{A-=p(UL~n@XaQV?Ik-xTa4y0ty&$} zXVU$GRoUFWQY%}=`9sLM{ylkD^TvL6`t(#4=-7PNrjS@bNj#@5rp6*_H z`YunpZqh!FFHldN-_N=K;+{Wu07nQMh^}CZg9y7RWWlf@w}&7iO0-5%g~k4h*y3@V zm(jz$)rk! z5yfD%si>zSqDqCQ!|GK}R4r)T`j08to>|8(4QSS>*tAH?vi0`zEv>E<<<4DecWT_c ztLT3Cn%1vKzGPi!4U`G-+(8rZ67D3p17OAa0C}rM87^9H|1N6+3@S1Q&|^h!0FBux zv(LOtKbXuKn?uK=4E5TUxt8mqC1bY^-Folb#L7rx#nr3xZ{=r^tHwn7-elpkVzoOI z%J^{{hnXi|-O=sxbJ$B|55D>K&~dw=%6`sFd;1H<|Gej_Ha+L!3I1spD`lH`kk#j( zI{e|6pJBHNR33sf6{aNXis#|z%!nVt_abUP)^=fKQR?>2d|oNJ zB$h#H<{UYeLHFfiVG`0@hmYApWRJuN3FeMv=6GgX3dX5Unu!&1S(s94r;nX{S*ZY@ zR{=_apiL1vfuV;!NoQCxHVT=ac_Dg$qDoO3fu%xW3W27ZG74#8lFG&DYoY3;->H#4 zsw#A&k_zgnr8?j#PqQ{qtF5tydMg9D&eZDyzXH1}h8N~m{vB?5a>-q*T)p}hr`@Tk zC7fKi2uwBHJ;*FqfDkb)m%-UvaMLmg^P zZ##713~4yT&uN2*N0cGxHdjO;VoixD(3oo#ulS4(8t#Wc{Dl*+2*xlnf{Q-%q8a@F z#WSkW451sy;MNGol!T!>J?4uw52*^MRa*%{9q#+N9$V4h~k&JAl jBOeLLNJ?^&l&qvBFNw)aYI2jD?4&0@3Cd6kvH$=(r%%^_ literal 0 HcmV?d00001 diff --git a/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032356/~elad/GALAPAGOS/Envs2.gif b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032356/~elad/GALAPAGOS/Envs2.gif new file mode 100644 index 0000000000000000000000000000000000000000..64fa2f60bfcd3bb0eef5baad115419bf98e40114 GIT binary patch literal 1780 zcmVApu5F%^ z-Y!4S{(e3ePp`l4?#=%XaGJdv$_g4hSd3A=fDHEyw6Uo4qdHV*_2tQ|B&VjR%2l4%JYd68+-i0x+O$ZqvduX5MA^6F;+mLC7o1&m zc_;2AfwwQnwSx8ir4zU?w!kXa@neB*Ctr^;*S=*OdcBCp#a2cx zkYYaI#+@_ICOm^=>huy@KYFN>));Az>Fx1nYUy7ON(zBI@Uf3?^GKzb!~W{Xr9 z!lN03(zNJdhSSAZqKQJFm;{S1zKDZrBaN7&K(481foSa&>EMn^I3`_%@-e9#j2t?| zjgTKMMq`#!9!TX`L?8(mMGImH*OnLJDB@*S)^p~S9hNsHnIi;to{T^eWFVJc&IzVr zY6cpjoCUgh;*$gx+Gm-w>7;LJ z6l#>9R+k)|4;sLu5drq)sRVce3aXKe%DU=z;p8gDt$7g({sCSVPUotqzy>MoY5hf8 z+o05vM(MSXDPk;L$Ue~RTi-emZd&8+G6A}qYCEj8)Q;Ogxn?2TC3`T{8{H4`&g*Wp z@G`J3SH#K`62U$MEO5WV{<{FeR^`f5MG^Pl@WTp!$FKqwGv%pK19{BD#vEVFT*e9D ziSJ`}LiG;I7a!;BY4o`&X0Yro)-R1B*Ng&Koz|6YZM=^9tEP=%u(MDDgWD@@x;^A` zia^^8DW<3%ifCiCrh9X>K&@0(($9hrq0|~m3$3Y{8X6sdca^Pc*Moh%H3C(|oEu;f z&c!#?8WkPgpM=hMIMW^P z?oRj4>F@0ZPjsWj8_gNg%HIwY(|=>!JA~5f<@d0W4vxJ=+iy#~(BR)$x@=LGUpee; zuPryFG^B|P)b%-C)B=g!31R-?m`Fuz^=M34)Zzd!h(#*$kOE@_SQo=6 zMkT)HNnFe#8j<)$7?x32ZA_yTT~}g$;vS$j%wdb+S{QOXQq8i2=`FX7iKu^vuUp zr@DNKbDyV7r?~7{H$ITEB;mxPLCe`9v3u@epL@mlMfFV#Ps9mUh0s;{Go_$jG|N>plg zl3O`d>QZ%z&X@vps;Q%CR2r(yd(?rdTV}N~ literal 0 HcmV?d00001 diff --git a/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032406/~elad/GALAPAGOS/img00001.gif b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032406/~elad/GALAPAGOS/img00001.gif new file mode 100644 index 0000000000000000000000000000000000000000..3b448819c519c66a472a75241945cc52f65d51b5 GIT binary patch literal 6581 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%0ADeHFaj09pc4gVurL}(niJ9$hMeS~NNp(B3TpI# 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 bJTHz;bi6NqIqCZ1ai8k?6NodtfcXCpYFxy} literal 0 HcmV?d00001 diff --git a/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032426/~elad/GALAPAGOS/img00003.gif b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032426/~elad/GALAPAGOS/img00003.gif new file mode 100644 index 0000000000000000000000000000000000000000..66c1de1cceaaf853b5b5f77ed57306029f3c4f97 GIT binary patch literal 1085 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 literal 0 HcmV?d00001 diff --git a/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032447/~elad/GALAPAGOS/img00010.gif b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032447/~elad/GALAPAGOS/img00010.gif new file mode 100644 index 0000000000000000000000000000000000000000..af5695d855f5713efd32c3fe0fc8ef88cf8fc87d GIT binary patch literal 1031 zcmaJ=e@L8l9DY`d7K2KLN>>N%*34z%)*EWqC>u9z2QSW%yE%vH7~htpC~^qHqqjEo zSnf8CuwKTP-NxHF^2od+*RpR#H}dkwVeRC_HV}!1$e^e9{4=5lzTby0d_M4e zp6BzeI#5~uO4Ckk#~QNGHjcJIn)TAONec^;L({7&AOIaO0121??RGky^myp?G8kke zLMfFTxSvAfv*;{Dpah{Z#9l+P63Z%B3%=*zhc4=Z*ZjO0W?Cu^xc8v30-ebgM0Tt?jjG7r^rE4 zIuz`2qoNVjooEQ4H3VM_eMwwgMwp1w5vNO1r0CBuyh53yz^1|>P^3Z8vDbi0LN!rK zoTR;r&hzvP(mTfBG$UzBD8NCW1vm=~15>~q*l1Izs8j`oMop(~(2&{U9H=%32ecyS z3XHvwE|^(g>^$jYmxt%Q91LIPT@G zAX5>Vk_r?Rs({d;8!#lK36uY&dn23z0YyWF4%I-NgfP)TOS(Nk=OubZ=pAS979%N3 zx3$av0w1gn41_dIvql1~ZOM|w)@5P)`sPi*I$q3nW&Z@WEaCninW}38lc%@b-*n{D z-Axm{Pd<|O@~^AE?L+Pp`})c+9IyN!|Mljj@|x$~>?tU7FWq=4lkn}XDeWq}AinL- zef#D&M}8jqp=a~ccNd=T2z__@jctz?A5|7>&K&4XEX@A(Zekci&HLAHhm%*1ets%< zm-mI+*Yn~%>FI4PbJ3=s0>!bzS3TqH^Pf#^{baadr0e&&og-r<^Ivw)7L-0%+p+kO z@6q>1=lidoIMZKLGI6D?BlF|OkM-u=t@~o}`~0|jMxQ&;d_B~(qu&=SZT#h2eQfHP YKa1W;eO3MU#JNLjt;wwqKZIBR0sZ6VmjD0& literal 0 HcmV?d00001 diff --git a/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032457/~elad/GALAPAGOS/img00011.gif b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032457/~elad/GALAPAGOS/img00011.gif new file mode 100644 index 0000000000000000000000000000000000000000..0c838b6f19231e4094df1fb04ee241ca5dc536c7 GIT binary patch literal 3801 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 EKMJ`|!vFvP literal 0 HcmV?d00001 diff --git a/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032510/~elad/GALAPAGOS/img00012.gif b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032510/~elad/GALAPAGOS/img00012.gif new file mode 100644 index 0000000000000000000000000000000000000000..ff7261a152d63dfa431efde73343901d3f004bf1 GIT binary patch literal 18528 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 literal 0 HcmV?d00001 diff --git a/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032521/~elad/GALAPAGOS/img00013.gif b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19970812032521/~elad/GALAPAGOS/img00013.gif new file mode 100644 index 0000000000000000000000000000000000000000..aaffee2f96e3aaa9df019ed0f8c2e81c9091a5af GIT binary patch literal 4653 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 ty^JPN*4NdnLF?u>WQS{h&7; + + + Galapagos + + + +

Welcome to
+GALAPAGOS

+ +Galapagos is an interactive multithreaded Scheme interpreter with turtle +graphics for Windows 95. It is built around the SCM interpreter, and it +provides multiple interpreters, threads, turtles, and drawing boards, all +running concurrently using WIN32's multithreading abilities, and freely +available. + +

+


+

+

+

+Spring 1997

+Graduation project

+Department of Math & Computer Science,

+Ben-Gurion University of the Negev

+
+Written by Elad Eyal and Miki +Tebeka.
+
+Supervisor: Dr. Michael Elhadad +
+

+

+


+

+ +

TABLE OF CONTENTS

+ + + +

+ +
+ +

DOWNLOAD CENTER

+

+

GNU LICENSE. COPYRIGHTED. PROVIDED "AS IS". NO +WARRANTIES OR LIABILITIES. ETC.
+

+

+500K gps10bin.zip - Executable and required Scheme libraries (SLIB)
+700K gps10src.zip - Same with all source code
+400K mfc40dll.zip - You might need this MFC40.DLL if you +don't have it already.
+ + diff --git a/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19990128140433/~elad/GALAPAGOS/gui.html b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19990128140433/~elad/GALAPAGOS/gui.html new file mode 100644 index 0000000..a6c0244 --- /dev/null +++ b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19990128140433/~elad/GALAPAGOS/gui.html @@ -0,0 +1,73 @@ + + + + Galapago - GUI + + + + + +

+ [PREV] + [PREV] + [PREV] +
+
+

+ +

THE INTERACTIVE GUI

+
+

In order to make Galapagos more fun to learn with, an interactive GUI +(Graphical User Interface) is provided. Users can make changes on the board +while a computation is in progress and effect its execution. Drawing tools +enable the user to draw on the board while a program is being executed. +If a line is drawn in front of a turtle which has a relevant interrupt, +the interrupt will be invoked if needed.
+

+ +

The user has a special user pen that can draw line, rectangles +or free hand. These modes are available from the toolbar. The User's pen +width and color can be modified using the User Pen menu or the toolbar.
+

+ +

Color buttons are provided on the toolbar to give a known RGB color +to the user pen. It is useful when the user draw an object on the board +and wants a turtle to see this object. The colors are:

+ +

White - (255 255 255)

+ +

Black - (0 0 0)

+ +

Blue - (0 0 255)

+ +

Red - (255 0 0)

+ +

Green - (0 255 0)

+ +

Yellow - (255 255 0)
+

+ +

Another option available is changing a turtle's heading and position, +using the Move Turtle button:

+ +


+

+ +

If this button is pressed then a turtle can be dragged to a new location +simply by dragging it with the mouse. In order to change the turtle's heading, +hold down a control key and move the move towards the desired location, +the turtle will follow the movement of the mouse.

+ +

+


+
+ [TOP] + [PREV] + [PREV] + [PREV] +
+ + + + + diff --git a/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19990128153816/~elad/GALAPAGOS/implementation.html b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19990128153816/~elad/GALAPAGOS/implementation.html new file mode 100644 index 0000000..822f9b9 --- /dev/null +++ b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19990128153816/~elad/GALAPAGOS/implementation.html @@ -0,0 +1,393 @@ + + + + Galapagos - Implementation + + + + + +
+ [PREV] + [PREV] + [PREV] +
+
+

+ +

IMPLEMENTATION

+ + + +
+

Galapagos was written using Microsoft Visual C++, and is designed to +run under Windows 95. We chose Windows 95 because it seems to have the +largest potential Galapagos users base. The following sections describe +some implementation details of Galapagos.
+

+ +

The SCM interpreter we used as a base is written in C. Most of the original +code we added was written in C++. The parts we used from SCM are almost +identical to the original. In fact, by changing the scmconfig.h file (which +contain machine-specific configuration) and #defining THREAD to be null, +the C files should become equivalent to the sources we used.
+

+ +

We have implemented two MT-safe FIFO message queue classes. Both will +block when trying to read from an empty queue. CMsgQx, the extended +message queue, supports the same interface as the one provided in Scheme, +plus an additional support for "Urgent Messages". These take +precedence over all other messages. CMessageQueue is message queue +with exactly the same interface as the Scheme level message queues, but +which contain internal logic to handle "Urgent" messages used +to deal with cases where synchronous respond is needed, such as I/O, Garbage +collection, and Scheme-level inter-thread communications.
+

+ +

FITTING SCM INTO WINDOWS
+

+ +

Galapagos is based on SCM, which is a single-thread, read-evaluate-print-loop +(repl) based Scheme interpreter. The most important issue in migrating +SCM was how to maintain the interpreter's natural repl-based approach, +yet allow for multiple threads to interact, and for Windows messages to +be processed quickly.
+

+ +

We used WIN32's multithreading capabilities to solve these problems. +A single thread handles all aspects of the GUI - in a sense, "all +that is Windows": graphic boards, turtles, consoles, menus and so +on. Each interpreter runs in a thread of its own, interacting with the +GUI using a message queue similar to the one provided at the Scheme level.
+

+ +


+

+ +

The GUI thread manages both commands received from the OS and from the +different interpreters running on their own threads. To ensure as fast +responses as possible, priorities are used: OS messages (such as windows +updates and input devices) gets highest priority; Console (text messages) +come second, and graphics messages are last. This allows the interpreters +to run interactively in a satisfactory manner.
+

+ +

SCM interpreter threads each run in the old-fashion repl mode. When +a computation is over, the interpreter blocks until new input comes from +the GUI thread. All blocking functions were modified to allow synchronous +messages (such as the one generated by tell-thread) to work. In +addition, SCM's "poll routine" is used to force checking for +such messages even during computations.
+

+ +

An additional thread is used for Garbage Collection. It is described +in detail in the section dealing with garbage collection.
+

+ +

GARBAGE COLLECTION

+ +

In this section we will briefly describe SCM's garbage collector, and +then discuss the modifications done to adapt it to Galapagos's multithreading +computations. It should be noted that the garbage collector used is a portable +garbage collector taken from "SCHEME IN ONE DEFUN, BUT IN C THIS TIME", +by George J Carrette <gjc@world.std.com>.
+

+ +

SCM uses a conservative Mark & Sweep garbage collector (GC). All +Scheme data objects share some common configuration (called "cells"): +They are 8-byte aligned; they reside is specially-allocated memory segments +(called hplims); they are the size of two pointers (so a scheme cons is +exactly a cell); and they contain a special GC bit used by the garbage +collector. This bit is 0 during actual computations. When a new cell is +needed and all the hplims are used, garbage collection is initiated. If +it does not free enough space to pass a certain threshold, a new hplim +is allocated.
+

+ +

The first stage in garbage collection is marking all cells which are +not to be deleted. Some terminology might be helpful here:
+

+ +
    +
  • A cell (or any data object) is called alive if it may +in some way influence the future of the computation. Needless to say, discovering +which cells are alive and which are not is impossible, because of the very +nature of the future.
  • +
+ +
    +
  • A cell is called reachable if the computation can read +its value. Some data is immediately reachable: The data on the machine's +stack or in the CPU registers, for example; some interpreters store some +information in a fixed location so it's permanently reachable. In SCM the +array sys_protects[] is used for +this propose. The set of reachable cells is the union of all immediately +reachable cells, and all those cells pointed by reachable cells, recursively. +
  • +
+ +

Obviously, all unreachable data is dead. Conservative garbage collectors +treat all reachable data as alive.
+

+ +

The Mark stage of the garbage collector scans the sys_protects[] +array and the machine's stack and registers for anything that looks like +a valid cell. All cell pointer have their 3 least significant bits zero, +and are in one of few known ranges (the hplims). The garbage collector +searches for anything matching a cell's bit pattern, and treats it as an +immediately reachable cell pointer. In some cases, this may mean an integer, +for example, happens to match the binary pattern and thus be interpreted +as a cell pointer. However, this will only mean some cell or cells are +marked as reachable though they are not such. Because of the uniform structure +of the cell and its limited range of possible locations, such an accident +is guarantied not to corrupt memory. Furthermore, if we accept the assumption +that integers are usually relatively small, and memory addresses are relatively +big, we conclude that such accidents are not very likely to happen often +anyway.
+

+ +

During mark stage, the garbage collector recursively finds (a superset +of) all live cells, and marks them by setting their special GC bit to 1. +The second stage is the Sweep stage, in which all the hplims are scanned +linearly, and every cell which is not marked is recognized as dead, and +as such is reclaimed as free. Marked cells get unmarked so they are ready +for the next garbage collection.
+

+ +

Mark & Sweep garbage collection has two main disadvantages: One, +that it requires all computation to stop while garbage collection is in +progress. In Galapagos, since all threads use a shared memory heap, it +means all threads must synchronize and halt while garbage is collected. +Second, Mark & Sweep is very likely to cause memory fragmentation. +However, since cells are equally sized, fragmentation is only rarely a +problem.
+

+ +

We chose to stick with Mark & Sweep in Galapagos because of its +two major advantages: Simplicity and efficiency. Mark & Sweep GC does +not affect computation speed, because direct pointers are used. Most concurrent +garbage collectors work by making all pointers indirect, which may slow +computations down considerably. The need to halt all threads for GC is +accepted. Since memory is shared, it would only be fair to stop all threads +when GC is needed: Threads will probably halt anyway since cells are allocated +continuously during computations.
+

+ +

Two major issues are introduced when trying to multithread the garbage +collector. One is the synchronization of the different threads, which run +almost completely unaware one of the other; the second is the need to mark +data from every thread's specific stack, registers, and sys_protects[]. +We solved these two issues by combining them to one.
+

+ +

The intuitive approach might be to let each thread mark its own information, +and then sweep centrally. However, since synchronization of threads is +mandatory, letting every thread mark its own data will lead only to redundant +marking and to excessive context switches, since each threads has to become +active. Therefore we created the "Garbage Collection daemon" +(GCd), which runs in a distinct thread and lasts for the whole Galapagos +session. The GCd is not an interpreter, but a mechanism which keeps track +of live threads and their need of GC. The GCd thread is always blocked, +except when a thread notifies it on its birth or death, or when a thread +indicates the need for garbage collection. Since the GC daemon is blocked +whenever it is not needed, and then becomes the exclusive running thread +during actual GC (with the exception of the GUI thread), its existence +does not hurt performance.
+

+ +

To explain how the GCd synchronizes all threads, let us examine the +three-way protocol involved. freelist +is a global pointer which holds a linked list of free cells - it can be +either a cell pointer, a value indicating "busy" (thus implementing +busy/wait protection over it) or "end of memory" which is found +at the end of the linked list. MIB stands for Memory Information +Block, which is a block of memory containing all of a thread's +immediately reachable data.
+

+ +

GCd scenario: GCd is blocked until a threads sends a GC +request.

+ +
    +
  1. GCd scans through its list of active threads, and sends each a MIB +request.
  2. + +
  3. It then blocks until all MIB blocks are received. GCd ignores further +GC request messages it get.
  4. + +
  5. At this point all threads are blocked. The GCd has gained, therefore, +exclusive access to the hplims. The GCd now marks all reachable cells, +inspecting each MIB block for immediately reachable cells and proceeding +recursively. Then, it sweeps.
  6. + +
  7. If needed, the GCd allocated a fresh hplim.
  8. + +
  9. GCd sends every thread a message allowing it to resume. Then it blocks +waiting for the next time.
  10. +
+ +

Scenario 1: A thread needs to allocate a cell but can't. +

+ +
    +
  1. The thread sends GCd a GC request message.
  2. + +
  3. Then it suspends until GCd sends it an MIB request.
  4. + +
  5. When one arrives, the thread generates and sends a MIB block to the +GCd.
  6. + +
  7. And blocks again until GCd notifies it that GC is done.
  8. + +
  9. At this point free cells are available and the computation can resume. +
  10. +
+ +

Scenario 2: A thread receives a MIB request. This +may happen within a computation or when considered otherwise blocked - +waiting for input, for example.

+ +
    +
  1. The thread generates and sends a MIB block to the GCd.
  2. + +
  3. And blocks until GCd notifies it that GC is done.
  4. +
+ +

The important thing to note about this protocol is its indifference +to the GC "initiator". Several threads can "initiate" +GC, and each request is "satisfied", although of course only +one GC takes place. The GCd itself is unaware of the initiating thread +identity, and completely ignores any further GC requests. It treats all +threads identically. This is important because it allows each thread meeting +a low memory condition to initiate GC immediately. This is in fact the +mechanism which saves us from explicitly checking for a third-party GC +request during computation: If a thread runs out of memory, the freelist +variable is kept at "out of memory" state, causing any other +thread trying to allocate memory to initiate GC as well. This simplifies +the GC protocol (technically, if not conceptually), and does it with almost +no affect on computation speed.
+

+ +

BOARDS
+

+ +

A board or a view as it called in MFC is the environment where a turtle +moves and interact with. It hold two main data structures. The first is +the bitmap of the drawing. It is a 800X600 bitmap. Every time a turtle +draws on the board it makes its pen the active pen on the board and draws +on it. Every time the picture needs refreshing (as signaled by the operating +system) it is the board's duty to copy the relevant section from the bitmap +to the screen. The second data object is the turtles list, an expandable +array of turtles which holds pointers to all turtles on the specific board.
+

+ +

The most important part in the board's work is to notify the turtles +on any event that happened on the board such as drawing, changing background +or moving of a turtle. If for example a user draws a line on the board, +the board (after drawing the line) goes through the turtles list and tell +each one that some event happened at a rectangle that contains the line. +Each turtle will decide if this has any importance to it or not.
+

+ +

Apart from that, the board handles all the user interface from the menus +and the toolbar. The most obvious example is the move turtle button, which, +when pressed, causes the board to find a turtle close enough to the click's +location. Then, on every movement of the mouse it gives the turtle a command +to move to this point.
+

+ +

In order to support scrolling of the picture, we derived the CBoardView +class from CScrollView. The interface with the interpreter threads +is done via a message queue. The main function is ReadAndEval, +which gets a message and then interprets its and act upon the result.
+

+ +

TURTLES
+

+ +

In addition to a pointer to its current board, and to inner-state variable +which affects its graphical aspects, every turtle holds an expandable array +of interrupts. When a turtle gets from the window that a message signifying +that some change has happened, it sends this change to each of its interrupts +(only if the interrupt flag is on) and the interrupt is responsible to +send an appropriate message if necessary. The turtle's location are stored +as floating points on x,y axes, to allow for accuracy on the turtle's location +and heading.
+

+ +

The turtles interacts with the interpreter thread using a message queue. +As with the board, the main function here is the ReadAndEval, +which translates these messages to valid function calls.
+

+ +

VISION
+

+ +

Every turtle holds a pointer to the bitmap it is drawing on. When it +is "looking" for a color it calculates the minimal rectangle +that holds the desired area. Then it iterates on all the pixels in this +rectangle. First it checks if the pixel is in the vision area using the +sign rule to determine if a point is clockwise or anti clockwise from a +line, and then check for distance. If the point is in the relevant area +the turtle gets its color from the bitmap and compares it with the sought +color.
+

+ +

When looking for a specific turtle, the turtle gets this turtle's position +and calculates if this location is in the relevant area using the same +algorithm. When looking for any turtle, the turtle passes the relevant +arguments to the view, which then uses the same algorithm for each turtle +on its turtles array.
+

+ +

INTERRUPTS
+

+ +

Each turtle holds an expandable array of interrupts. Each interrupts +is an object that is much like a turtle vision. The interrupts has the +view area argument and what it is looking for. It also has the message +it needs to send and a pointer to the given queue. When the turtle notifies +the interrupt that a change has happened, the interrupt first checks if +the change is an area which is of interest to it. If so it calls the turtle +look function with its location and the sought object. According to the +turtle's answer and to the data stored inside the interrupt, the interrupt +sends the needed message, if any.
+
+

+ +

CLASS ORGANIZATION
+

+ +


+
+

+ +

Message-passing mechanisms:
+

+ +

+

+ + + +

+


+
+ [TOP] + [PREV] + [PREV] + [PREV] +
+ + + + + + diff --git a/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19990129014748/~elad/GALAPAGOS/manual.html b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19990129014748/~elad/GALAPAGOS/manual.html new file mode 100644 index 0000000..030d010 --- /dev/null +++ b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19990129014748/~elad/GALAPAGOS/manual.html @@ -0,0 +1,1404 @@ + + + + Galapagos - Programmer's Manual + + + + + +
+ [PREV] + [PREV] + [PREV] +
+
+

+ +

PROGRAMMER'S MANUAL:
+NONSTANDARD PRIMITIVES

+ +
+ +

+


+ +

Welcome to Galapagos Scheme. This chapter is intended +as a quick reference to Galapagos's extensions over traditional Scheme. +Knowledge of Scheme is assumed. Galapagos Scheme is compliant with both +R4RS and IEEE standard P1178. If you've read the chapter titled +"Scheme extensions", you can and should skip the short introduction +in each section. This complete chapter appears as on-line help in Galapagos, +just a F1 click away.
+

+ +

+

+ +

ENVIRONMENTS
+

+ +

An environment is a list of frames, +with the global environment in its tail. A frame is a list +of bindings, which map variables to their values. (define...) +adds a binding to the frame at the top of the current environment. +(set!...) family of commands modify +an existing binding, in the frame where it was defined. When a variable +is referenced, the current environment is searched from head to tail, and +the first binding found dictates the value of the variable.

+ +

The first interpreter, which pops up as Galapagos +is started, runs at the global environment (the way traditional Scheme +works). Additional interpreters (threads) run at distinct environments, +which contain a single initially empty frame, and a pointer to the global +environment.
+
+

+ +

(clone-environment +env [depth])
+

+ +

Clone-environment will make an exact copy of the +environment env, by copying its frames +one by one. If depth is specified then the new environment will be the +collection of frames which is up to depth +frames from the current frame. And the last frame will point to the depth ++ 1 frames from the current one in env. +
+

+ +

This means that if we are now in environment e1 +and done (define x 7). Then if we'll +write

+ +

(define e2 (clone-environment +(current-environment))),

+ +

the result of

+ +

(eval@ e2 x) +

+ +

will return 7.
+

+ +

But if we are not in a lower frame than the one +x was defined in and write

+ +

(define e2 (clone-environment +(current-environment) 1))

+ +

and write the value of x is undefined.

+ +

(Unless it was defined in the global environment) +
+

+ +

Note: Only the bindings are copied. The bound values +are not. Example:

+ +

(define x (cons 1 2)) +

+ +

(define e (clone-environment +(current-environment)))

+ +

(eval@ e (set-cdr! X 6)) +

+ +

will change the 2 into 6 at both environments. +However,

+ +

(set! x 7) +

+ +

will only affect one copy.
+

+ +

(pop-environment +env)
+

+ +

Returns the current environment without the first +frame. This means the first frame on the list of frames is "popped" +out.

+ +

If env was +made from f3->f2->f1->Global, the result will be f2->f1->Global. +

+ +

(fx means frame number x)

+ +

Example:

+ +

(define e2 (pop-environment +(current-environment)))
+

+ +

(extend-environment +env)
+

+ +

Extends env with +a new empty frame (where nothing is defined yet).

+ +

This means the if env +was f2->f1->Global the result will be f3->f2->f1->Global. +

+ +

(fx means frame number x)

+ +

Example:

+ +

(define e2 (extend-environment +(current-environment)))
+

+ +

(current-environment) +
+

+ +

Returns the current environment.
+

+ +

(environment? +env)
+

+ +

A predicate that is true if env +is an environment.

+ +

Example:

+ +

(environment? (current-environment)) +

+ +

Will return true.
+

+ +

(parent-environment) +
+

+ +

Returns the parent environment. This is the environment +where (new-thread) was called to create +this thread. The First thread returns the global environment.

+ +

Example:

+ +

(eval@ (parent-environment) +y)

+ +

Will return the value of y in the parent environment.
+

+ +

(base-environment) +
+

+ +

The environment where the interpreter runs.
+

+ +

(set-base-environment +env)
+

+ +

Sets the base environment (where the interpreter +runs) to be env

+ +

Example:

+ +

(set-base-environment +(parent-environment))

+ +

Will make this thread run in the same environment +as its father)
+

+ +

(eval@ env forms...) +
+

+ +

Evaluates forms in given environment.

+ +

Example:

+ +

(define x 7) +

+ +

(define e2 (clone-environment +(current-environment)))

+ +

(eval@ e2 x)
+

+ +

The result will be 7
+

+ +

(eval@p forms...) +
+

+ +

Evaluates forms in parent environment.

+ +

Example:

+ +

Say we want to make our turtle walk 30 degrees +more than the father's turtle. Then we can write:

+ +

(set-heading! T (+ 30 +(eval@p (turtle-heading t))))
+

+ +

MESSAGE QUEUES
+

+ +

Message queues are MT-safe mechanisms used to pass +messages, possibly between threads. Messages accepted must be cons, its +car being the message type and the cdr is the message body. Both can be +any kind of Scheme object.
+
+

+ +

(make-queue) +

+ +

Creates a new message queue.

+ +

Example:

+ +

(define q (make-queue)) +
+

+ +

(message-queue? +q)

+ +

A predicate that is true if q +is a queue.

+ +

Example:

+ +

(message-queue? q)

+ +

Will return true for q from the previous example.
+

+ +

(peek-message +q [type])
+

+ +

Return true if there is a message (of given type, +or of any type if unspecified) in the queue q. +

+ +

Example:

+ +

(peek-message q) +

+ +

Will return falsif the queue q is empty. +

+ +

Note: types are compared using (equals?) +.
+

+ +

(post-message +q typ_msg)
+

+ +

Posts the message typ_msg +to the queue q.

+ +

typ_msg must +be a cons (type . message).

+ +

Example:

+ +

(post-message q (cons +'type-welcome 'hello))
+

+ +

(get-message [time-out] +q [type])
+

+ +

Get message from queue q +, if time-out is defined +waits only time-out seconds, and

+ +

optionally gets only messages from type type. +

+ +

Example:

+ +

(define msg (get-message +7 q 'type-welcome))

+ +

The result will be (if the previous posting was +done) ('type-welcome . 'hello)

+ +

Note: types are compared using (equals?) +.
+

+ +

WINDOW COMMANDS
+
+

+ +

A window is the graphical board on which the turtles +and the user draw. It is a bitmap of size 800x600.
+
+

+ +

(new-window [name]) +
+

+ +

Makes a new window, name +is a symbol or a string which will also be the window's title. The window's +color will be white and it's size 800x600.

+ +

Example:

+ +

(define w (new-window +'my-window))

+ +

Will create a new window with the title my-window. +
+

+ +

(rename-window! +win [name])
+

+ +

Renames the window win. name +is a symbol or a string which will also be the window's title.

+ +

Example:

+ +

(rename-window! w 'foo) +

+ +

Will make the title of w to be foo.
+

+ +

(set-background-color! +R G B)
+

+ +

Set the background color of the window. All the +turtles in the window are notified on the new color (used in pen-erase) +

+ +

The colors are defined in terms of Red +Green Blue +(where 0,0,0 is black and 255,255,255 is white).

+ +

Example:

+ +

(set-background-color! +w 255 255 0)

+ +

Will turn the background color of w +to yellow
+

+ +

(clear-window +w)
+

+ +

Clears the screen from all the previous drawings, +leaving only the turtles images on it.

+ +

Example:

+ +

(clear-window w)
+

+ +

(load-bitmap w +"filename" [x y])
+

+ +

Loads the bitmap "filename" +and makes it the background of w. x y are +the coordinates of the upper left corner of the picture. If x +y are not given then the picture is centered.

+ +

Example:

+ +

(load-bitmap w "c:\\windows\\forest.bmp") +
+

+ +

This operation can also be done using the Board +menu.
+
+

+ +

(save-bitmap w +"filename")
+

+ +

Saves the window into a bitmap file called "filename". +

+ +

Example:

+ +

(save-bitmap w "my_draw.bmp") +
+

+ +

This operation can also be done using the Board +menu.
+

+ +

(window-alive? +win)
+

+ +

True if win +is alive, meaning it can get commands.
+

+ +

(window-name w) +

+ +

Returns the name of w. +

+ +

Example:

+ +

(window-name w) +

+ +

Will return "foo" on our window.
+

+ +

TURTLE COMMANDS

+ +

A turtle is an object which is connected to a certain +window. It has inner state variables:
+

+ +

- width: the width +of the pen.

+ +

- heading: the direction +the turtle will go on command forward!. +The heading is in degrees where 0 is upwards and adding to the heading +means clock wise rotation.

+ +

- visibility: if the +body of the turtle is visible on the board or not.

+ +

- solid: if the turtle +is a "solid" turtle (its interior is also drawn) or "hollow" +one (only its circumference is drawn).

+ +

- position: the location +of the turtle on the board, where 0,0 is the upper left corner. +

+ +

- color: the color +of the turtle and it's pen, given in RGB format.

+ +

- pen condition: the +turtle's pen can be in three states:

+ +
    +
  • pen-down : the turtle +will draw as it moves.
  • + +
  • pen-up : the turtle +will not draw as it moves.
  • + +
  • pen-erase : the turtle +will draw in the color of the background as it moves.
  • +
+ +

- pen width: the width +of the pen, the bigger the width the thicker the pen will be.
+

+ +

Turtles can also "see" the board or other +turtles (only from the same board) and can handle user interrupts. A turtle +is always connected to a certain view, which is the view it is drawing +on. Turtles can move between views.
+
+

+ +

(make-turtle win +[name])
+

+ +

Creates and return a new turtle, in window win, +optional name (where name can be anything). +

+ +

The inner state of the new turtle will be: +

+ +
    +
  • position - 400,300
  • + +
  • heading - 0
  • + +
  • color - 0,0,0 (black)
  • + +
  • width - 2
  • + +
  • visible - true
  • + +
  • solid - true
  • +
+ +

Example:

+ +

(define t (make-turtle +'turty))
+

+ +

(turtle-alive? +t)
+

+ +

A predicate that is true if t +is alive, meaning t can get commands. +

+ +

Example:

+ +

(turtle-alive? t)

+ +

Will return true on our t.
+

+ +

(clone-turtle +t [name])
+

+ +

Creates an identical turtle to t +(same inner state).

+ +

Example:

+ +

(define t2 (clone-turtle +t))
+

+ +

(rename-turtle +t [name])
+

+ +

Renames the turtle, name is a string or a symbol +

+ +

Example:

+ +

(rename-turtle t 'pongy) +
+

+ +

(turtle-name t) +
+

+ +

Returns the name of t. +

+ +

Example:

+ +

(turtle-name t) +

+ +

Will return "pongy" on our t.
+

+ +

(forward! t d)
+

+ +

Makes t go +forward (in the heading of t) +d steps. +t will draw while going according to +the state of it's pen.

+ +

Example:

+ +

(forward! t 100) +

+ +

Will cause t +to go forward 100 steps. (In our case since t's +heading hasn't changed it will go upwards)
+

+ +

(turtle-width! +t n)

+ +

Set the width of t's +pen to be n. The bigger n +is the wider the pen will be.
+

+ +

(backwards! t +d)
+

+ +

Same as forward, just in the opposite direction. +

+ +

Example:

+ +

(backwards! t 100) +

+ +

is the same as

+ +

(forward! t -100)
+

+ +

(right! t d)
+

+ +

Will set a new heading to t. +The new heading is the old heading plus d, meaning +t will rotate clock-wise.

+ +

Example:

+ +

(right! t 90) +

+ +

Will make t +turn 90 degrees to the
+

+ +

(left! t d) +

+ +

Same as right, other direction
+

+ +

(set-heading! +t val)
+

+ +

Sets the heading of t +to be val. 0 is upwards and 90 is to +the right.

+ +

Example:

+ +

(set-heading t 180) +

+ +

Will cause t +to point to the bottom of the screen.
+

+ +

(move-to! t x +y)
+

+ +

Makes t move +to point x,y without painting. 0,0 +is the top-left corner of the window.

+ +

Example:

+ +

(move-to! T 100 100) +

+ +

Will cause t +to move to point 100,100.
+

+ +

(draw-to! t x +y)
+

+ +

Moves t to +x,y possibly drawing or erasing according +to the state of t's pen.

+ +

Example:

+ +

(draw-to! t 0 0)
+

+ +

(move-turtle-to-window +t win)

+ +

Move t to the +window win

+ +

Example:

+ +

(move-turtle-to-window +t w)
+

+ +

(pen-up! t)
+

+ +

The pen of t +is up, so he won't paint when moving.

+ +

Example:

+ +

(pen-up! t)
+

+ +

(pen-down! t)
+

+ +

Causes t's +pen to be down, meaning he will draw as he is moving.
+

+ +

(pen-erase! t)
+

+ +

Causes t's +pen to be in the same color as the background color of the window it is +attached to.
+

+ +

(show-turtle! +t)
+

+ +

Makes t visible. +Meaning he will be seen on the board.

+ +

Example:

+ +

(show-turtle! t)
+

+ +

(hide-turtle! +t)
+

+ +

Makes t invisible. +Meaning he will not be seen on the board. (but all the drawing he does +will be seen)

+ +

Example:

+ +

(hide-turtle! t)
+

+ +

(make-turtle-solid! +t)
+

+ +

Makes t a solid +turtle.
+

+ +

(make-turtle-hollow! +t)
+

+ +

Make t a "hollow" +turtle.
+

+ +

(kill-turtle! +t)
+

+ +

Kills t. Meaning +it will be erased from the board and will not accept further commands. +

+ +

Note: This is the only way to get rid of a turtle. +

+ +

Example:

+ +

(kill-turtle! t) +

+ +

Will cause when writing t +in the command line to the response

+ +

#<dead turtle>
+

+ +

(set-color! t +R G B) or (set-color! t (list R G B)
+

+ +

Sets t's color +(and it's pen), in RGB format.

+ +

Example:

+ +

(set-color! t 255 0 255) +

+ +

Will cause t +to be pinkish.

+ +

Same as:

+ +

(define pinkish '(255 +0 255))

+ +

(set-color! t pinkish)
+

+ +

(turtle-inner-state +t)
+

+ +

Returns a list of 6 parameters: color, heading, +hidden-flag, pen width, solid flag, location (cons x y))

+ +

Example:

+ +

(define new-t (make-turtle +w))

+ +

(turtle-inner-state new-t) +

+ +

Will return the list

+ +

((0 0 0) 0.0 #f 2 #t (400.0 +. 300.0))
+

+ +

Below are functions that returns only one of the +parameters returned by turtle-inner-state: +
+

+ +

(turtle-color t) +

+ +

(turtle-heading t) +

+ +

(turtle-visible t) +

+ +

(turtle-width t) +

+ +

(turtle-solid? t) +

+ +

(turtle-position t)
+

+ +

TURTLE VISION
+

+ +

A turtle can interact with the board. It can "see" +colors or other turtles.
+
+

+ +

(look t distance +angle '(R G B))
+

+ +

Will return true if there is a point in color (R +G B) in distance distance from +t and in the area bordered by the angle +2*angle.

+ +

Example:

+ +

(look t 50 20 '(0 0 0)) +

+ +

Will cause t +to search for the color black (RGB 0,0,0) in the area shown here in blue:
+

+ +


+

+ +

(look t distance +angle [t1])
+

+ +

Same as if looking for color, just this time it +will be true is t1 is in the visible area.

+ +

If no target turtle is defined then the function +will return true if any turtle from this window is in the visible area. +

+ +

Example:

+ +

(define new-t (clone-turtle +t))

+ +

(forward! new-t 30) +

+ +

(look t 50 20 new-t) +

+ +

And

+ +

(look t 50 20) +

+ +

Will both return true.
+
+

+ +

INTERRUPTS (NOTIFICATIONS) +
+

+ +

A turtle can hold a list of interrupts (or notifications). +When an interrupt is invoked it send a given message to the thread that +sent the command. Every interrupt is defined by a "look" arguments. +An interruptcan be of three kinds:
+

+ +

A "yes" interrupt - The interrupt will +happen (message sent) on every "first" time the look returns +yes.

+ +

Meaning if a turtle is told to invoke an interrupt +every time it sees blue on a certain region. Then the first time it sees +blue it will invoke the interrupt. From now on if the blue is in view it +will not invoke the interrupt. Then if it loses sight of the blue object, +the next time it sees blue again it will invoke the interrupt, and so on.
+

+ +

A "no" interrupt - Same as the "yes" +interrupt, just this time the interrupt is invoked when the sought object +is not seen.
+

+ +

A "both" interrupt - First time the sought +object is viewed the "yes" message is sent, then the first time +the turtle loses sight of the object the "no" message is sent +and so on.

+ +

A message can be any SCHEME object.
+

+ +

When the interpreter is installing interrupt to +a turtle it need to install a handler, which is a function that +takes only one argument and this argument is the messages that comes from +the interrupt.

+ +

If no handler is installed, the messages will be +sent but will have no affect on the thread of execution.

+ +

There can be only one handler per thread and a +handler can not be a primitive procedure.
+

+ +

(turtle-notify +t msg1 msg2 distance angle TARGET)

+ +

Instructs a turtle to send msg1 and msg2 upon seeing +and not seeing, respectively, the target. The messages can be any Scheme +objects, which are sent to the thread as if by (tell-thread). The other +parameters - see (look)

+ +

Example:

+ +

(turtle-notify t 'yes +'no 50 10 new-t)

+ +

This is a "both" kind interrupt.
+

+ +

(turtle-no-notify +t distance angle TARGET)
+

+ +

Tells the turtle to stop notifying in the given +case. Very like deleting the interrupt from the turtle.
+

+ +

(notify-when[-not] +t1 msg dist ang TARGET)
+

+ +

Instructs a turtle to send msg upon [stopping] +seeing the target. This is a "yes" or "no" interrupt. +

+ +

Example:

+ +

(notify-when t 'gotcha +50 10 new-t)

+ +

Will cause t +to send the message "gotcha" every "first" time it +sees new-t.
+

+ +

(stop-notifying +t)
+

+ +

t will temporarily +stop notifying on interrupts. Like "clear interrupts".
+

+ +

(continue-notifying +t)
+

+ +

t will resume +notifying on interrupts.
+

+ +

(no-notifications +t)

+ +

Deletes all t's +interrupts.
+

+ +

(notify-on-click +turtle msg)
+

+ +

Instructs turtle to send msg when right-clicked +with the mouse (distance of 5 pixels from the turtle location). There can +be only one interrupt of this kind per turtle.

+ +

Example:

+ +

(notify-on-click t 'ouch) +

+ +

Will case t +to send the message "ouch" when the user right-clicks next to +it.
+

+ +

(notify-on-click +window msg)
+

+ +

Instructs window to +send msg when right-clicked with the +mouse not close to any turtle.
+

+ +

(clear-notify-click +t)
+

+ +

Clears the user right click interrupt
+

+ +

(install-handler +func)
+

+ +

Installs a message handler. When a message arrives, +func is called with it as a sole argument. +

+ +

There can be only one handler per thread. func +can not be a primitive procedure.

+ +

Example:

+ +

(define (print x) (write +x))

+ +

(notify-on-click t 'click-on-t) +

+ +

(install-handler print) +

+ +

Will cause that the message "click-on-t" +will be printed each time the user right clicked on t. +
+

+ +

THREADS
+

+ +

Galapagos supports multiple threads. Every thread +is a complete Scheme interpreter, with its own base environment. Every +thread has a Thread Object, which uniquely identifies it.
+

+ +

A console is a text window where the user +can type commands (when the interpreter is idle) and see output. A thread +may or may not be bound to a console. Information printed by a non-bound +thread is lost; a non-bound thread waiting for input is stuck (unless provisions +were made to allow a new console to be created by means of inter-thread +communications.) If a non-bound thread has nothing to do, instead of waiting +for input like a bound thread, it will terminate.
+

+ +

(this-thread)
+

+ +

Returns the thread-object of the current thread. +

+ +

Example:

+ +

(this-thread) +

+ +

Will return something like

+ +

#<thread 0x6d1e2c> +
+

+ +

(is-first-thread?) +
+

+ +

True if the current thread is the first SCM thread.
+

+ +

(thread? t) +

+ +

True if t is a thread

+ +

Example:

+ +

(thread? (this-thread)) +

+ +

Will return true
+

+ +

(active-threads) +
+

+ +

Returns the number of active threads
+

+ +

(new-thread form+) +

+ +

Creates a new thread that will calculate the form[s] +

+ +

Example:

+ +

(new-thread (define t +(make-turtle w)) (forward! t 200))

+ +

Will make a new thread that will create a new turtle +and will move it forward 200 steps and then terminates.

+ +

(new-thread (bind-to-console)) +

+ +

Will make a new thread that's ready to accept commands +form a newly-created window. The same can be achieved by selecting "Fork" +from "Scheme" menu.
+
+
+

+ +

(break& form+) +
+

+ +

Causes the current thread to stop and calculate +the form[s]. The current computation is lost.
+

+ +

(bind-to-console) +
+

+ +

The thread will get its commands from a console. +

+ +

Example:

+ +

(new-thread (bind-to-console)) +

+ +

Will create a new thread that gets it.
+

+ +

(unbind-console) +

+ +

Close bound console.
+

+ +

(rename-console +name)

+ +

New name for the current console
+

+ +

(install-handler +func)
+

+ +

Installs a message handler. When a message arrives, +func is called with it as a sole argument. +

+ +

There can be only one handler per thread. func +can not be a primitive procedure.

+ +

Example:

+ +

(define (print x) (write +x))

+ +

(notify-on-click t 'click-on-t) +

+ +

(install-handler print) +

+ +

Will cause that the message "click-on-t" +will be printed each time the user right clicked on t. +

+ +

Note: (new -thread (install-handler +f)) is a bad idea, because the fresh thread will terminate immediately. +
+

+ +

(tell-thread th +x)
+

+ +

Sends message X +to thread th. Returns true on success. +

+ +

If th has no +handler installed it will cause nothing.
+

+ +

(quit-thread)
+

+ +

Kills the current thread, does not work on the +main thread.
+

+ +

(quit-program)
+

+ +

Quits the program.
+
+
+

+ +

These are primitives taken from SCM, which were +modifies to be multithread-safe: + +

+ + +

+An arbiter +is a data object the canbe used as a +guard for critical sections. It can be either "locked" or "unlocked". It +is ideal when a busy/wait mechanism is required, since it is MT-safe. +

+ + +

(sleep n) +

+ +

Causes the current thread to block for (approximately) +n seconds. (sleep 0) is a way to instruct +a thread to give up its remaining processor time.
+

+ + +

(make-arbiter +name)
+

+ +

Makes an arbiter called name. +

+ +

Example:

+ +

(define x-arb (make-arbiter +'x-guard))
+
+

+ +

(try-arbiter arb) +
+

+ +

Checks if the arbiter arb +is up. If the arbiter is up returns false, otherwise it sets +the arbiter to be "up" and returns true.

+ +

Example:

+ +

(try-arbiter x-arb) +

+ +

Will return true and set x-arb +to be "up". But trying it for the second time return false since +x-arb is "up".
+

+ +

(release-arbiter +arb)
+

+ +

Set the arb +to be "down". If the arbiter was "up" returns true +otherwise returns false.

+ +

Example:

+ +

(release-arbiter x-arb) +

+ +

Will return true , but using this function again +will return false since x-arb is already +down.

+ + +

+


+
+ [TOP] + [PREV] + [PREV] + [PREV] +
+ + + + + diff --git a/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19990417073305/~elad/GALAPAGOS/index.html b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19990417073305/~elad/GALAPAGOS/index.html new file mode 100644 index 0000000..56faa74 --- /dev/null +++ b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19990417073305/~elad/GALAPAGOS/index.html @@ -0,0 +1,95 @@ + + + + Galapagos + + + +

Welcome to
+GALAPAGOS

+ +Galapagos is an interactive multithreaded Scheme interpreter with turtle +graphics for Windows 95. It is built around the SCM interpreter, and it +provides multiple interpreters, threads, turtles, and drawing boards, all +running concurrently using WIN32's multithreading abilities, and freely +available. + +

+


+

+

+

+Spring 1997

+Graduation project

+Department of Math & Computer Science,

+Ben-Gurion University of the Negev

+
+Written by Elad Eyal and Miki +Tebeka.
+
+Supervisor: Dr. Michael Elhadad +
+

+

+


+

+ +

TABLE OF CONTENTS

+ + + +

+ +
+ +

DOWNLOAD CENTER

+

+

GNU LICENSE. COPYRIGHTED. PROVIDED "AS IS". NO +WARRANTIES OR LIABILITIES. ETC.
+

+

+500K gps10bin.zip - Executable and required Scheme libraries (SLIB)
+700K gps10src.zip - Same with all source code
+400K mfc40dll.zip - You might need this MFC40.DLL if you +don't have it already.
+ + diff --git a/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19990424140956/~elad/GALAPAGOS/extensions.html b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19990424140956/~elad/GALAPAGOS/extensions.html new file mode 100644 index 0000000..67d97f1 --- /dev/null +++ b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19990424140956/~elad/GALAPAGOS/extensions.html @@ -0,0 +1,493 @@ + + + + Galapagos - Scheme Extensions + + + + + +

+ [PREV] + [PREV] + [PREV] +
+
+

+ +

SCHEME EXTENSIONS
+

+ + + +

+


+ +

We have extended Scheme in two main +directions: Turtle graphics and multithreading:
+

+ +

The turtle object lives on a board on which it can move and draw. +A turtle can also communicate with the board and "see" colors +or other turtles. Galapagos Scheme provides a set of primitives to create +and manage such turtles and the boards they live on.
+

+ +

A set of additional primitives enable the programmer to create multiple +interpreters that run concurrently. The environment model was extended +to support shared or thread-specific environments, and primitives to handle +multiple environments were also added.
+
+

+ +

THE NEW ENVIRONMENT MODEL
+

+ +

A frame is a table which maps (or binds) names to values. An +environment is a chained list of frames in which the interpreter works. +

+ +

For example the command:

+ +

(define x 7)

+ +

creates a binding between x and the value 7.

+ +

A typical environment looks like this:

+ +

+
+

+
+
+
+Each rectangle denotes a frame and inside it are the bindings it holds. +The rightmost rectangle is the global environment.
+

+ +

When a variable is evaluated, the interpreter first tries to find it +in the current frame. If a suitable binding can't be found, the interpreter +moves to the next frame in the environment and searched for a binding there.
+

+ +

In our example if we write x in the command line we'll get 12 +as the answer because all such computations take place at the global environment. +
+

+ +

A function application is always evaluated with respect to the environment +the in which it was defined. (A function "holds" its environment, +hence the name "closure") This means that if we write

+ +

(define (f) x)

+ +

and then

+ +

(f)

+ +

the result will be

+ +

12.
+
+
+
+
+

+
+

+
+In traditional SCHEME we have only one interpreter running at a time, so +at a given point of calculation there is only one environment. In Galapagos +multiple interpreters can run at the same time, and each of them has its +own environment.
+

+ +

Under Galapagos's environment model, every interpreter works on its +branch of an "environments tree", but can also evaluate an expression +in any other environment in the tree. If two interpreters have a shared +node on the tree, then from that point up (towards the global environment) +all the bindings are the same for the two interpreters. The global environment +is shared by all interpreters. If an interpreter changes the value of some +variable, the binding is changed in all other interpreters that have access +to the frame where the variable was declared. Obviously, caution should +be taken when writing to a shared variable.
+

+ +

As an example, if a user created two new threads, called A and B, and +then evaluated:

+ +

First thread> (define +x 7)

+ +

(define (f) ...)

+ +

Thread A> (define (g) +x)

+ +

Thread B> (define x 4) +

+ +

this is how the environment model would look like:
+

+ +


+

+ +

Now consider what happens when the user evaluates this:

+ +

Thread A> (set! f g) +

+ +


+
+

+ +

Now, evaluating (f) in thread B will call the function defined +in thread A. It will return 12 which is the value of x in f's environment. +If thread A defines a new x (using define), it will affect the result +of subsequent calls to f.
+

+ +

Sharing environments and frames are Galapagos's way of allowing shared +data. By default, however, most calculations are done at thread-specific +frames. (More on this subject in the next section). Primitives are supplied +to explicitly reference and manage environments: clone-environment +can create a copy of an environment (so changing a binding in one copy +does not alter the other); extend-environment and pop-environment +can add and remove frames to and from environments. More environment functions +are found in the next section of this document.
+

+ +

THREADS
+

+ +

A thread is a SCHEME interpreter. The base environment of a thread +is the thread's topmost environment. All forms entered at the thread's +console or as arguments to new-thread are evaluated in the base +environment. In traditional SCHEME there is only one thread of execution. +It is a single thread and its base environment is the global environment. +In Galapagos many interpreters can run concurrently, and each have its +own environment (changing dynamically as computation progresses) and a +base environment (which can be explicitly changed).
+

+ +

One thread is created by Galapagos upon startup. It is called the main +thread, and it lasts for the whole Galapagos session. Its base environment +is the global one - much like a traditional Scheme interpreter. Additional +threads can be created using new-thread. These have their base environment +set to a new environment, containing a single fresh frame pointing to the +global environment. Any calculation done at the new thread's console takes +place in this thread-local environment. However, if closure functions are +used, then their evaluation may take place at the global environment or +at some other thread's space, depending on where that function was defined. +
+

+ +

When a thread finishes the execution of its commands it terminates. +There are two exceptions to this rule:

+ +
    +
  1. The main thread can be only terminated by using quit-program. +
  2. + +
  3. A thread that is bound to the console will not terminate at the end +of execution but will wait for the next command input.
  4. +
+ +

Threads can communicate using the predicate tell-thread or by +using the asynchronous message-queues system described later. In addition, +SCM's arbiters were improved to be multithread safe. An arbiter +object can serve as a guard on a critical section (where only one thread +can work at a given time) of the program. The relevant primitves are make-arbiter, +try-arbiter, and release-arbiter.
+

+ +

Note: Galapagos supports Scheme's notation of continuations. +However, two restrictions apply:

+ +
    +
  1. Only "cheap" continuations are supported. That is, a continuation +can only be called when it is still active. This allows for continuations +to be used to implement exception handling, etc.
  2. + +
  3. Continuations can not cross thread boundaries. Also continuations, +like any other Scheme object, can be handled by any thread, they can only +be called from within the thread that created them. Trying to call a continuation +from a different thread will cause an error.
  4. +
+ +

CONSOLES
+

+ +

A console is a text window where the user can type commands (when +the interpreter is idle) and see output. A console has a name which can +be changed dynamically, which appears on its title bar. A thread may or +may not be bound to a console. Information printed by a non-bound thread +is lost; a non-bound thread waiting for input is stuck (unless provisions +were made to allow a new console to be created by means of inter-thread +communications.) If a non-bound thread has nothing to do, instead of waiting +for input like a bound thread, it will terminate.
+

+ +

The main thread is always bound to a console. To bind a thread to a +console use the command bind-to-console from within the thread.
+

+ +

DRAWING BOARDS
+

+ +

A board (window) is the graphical board on which the turtles and the +user draw. It is a bitmap on which the user can draw interactively, by +using the supplied GUI, or by creating turtles and instructing them to +do the drawings.
+

+ +

The controls of the graphical user interface are located on the toolbar. +The "shapes" of drawing are either a rectangle, a line or free +hand drawing. The user pen can have three widths which are found under +the User Pen menu. The numbers next to the sizes are the widths +in pixels.
+

+ +

The colors of the user pen can be changes either from the User Pen +menu or from the toolbar's color buttons. When choosing from a toolbar +button, the user can know exactly what color (in RGB format) is used.
+

+ +

Each window has a name which is written on its title bar which can be +changed using the rename-window! command. The board can be cleaned +from all drawings using the clear-window command.
+

+ +

Since the board is a bitmap it can be saved to a BMP file using the +save-bitmap command. A new background from a bitmap file can be +loaded using the load-bitmap command.
+

+ +

TURTLES
+

+ +

A turtle is an object which is connected to a certain board. Each turtle +has a pen with which it can draw on that board. The user can change the +state of the turtle's pen including giving it the color of the board's +background color (using the pen-erase! command). The pen will draw +when it is "down" and will not draw when it is "up". +Turtles can move between boards using the move-turtle-to-window +command.
+

+ +

Each turtle holds its location as the a pair of coordinates where 0,0 +is the upper left corner of the board and 800,600 is the bottom-right corner +of the board. The turtle's location can be changed by giving the turtle +commands such as forward!, backwards!, move-to! or by using the +move button from the toolbar.
+

+ +

A turtle also has a heading which is the direction it will move on the +forward! command. The heading is in degrees, 0 meaning upwards and +increasing clockwise, thus 90 means rightwards and so on. A turtle's heading +can be changed by commands such as right!, left!, and set-heading! +or interactively, by using the move button on the toolbar and pressing +the control key.
+

+ +

A turtle can be visible on the board or be hidden. When it is visible +the user can decide if it wants a "solid" or "hollow" +turtle using the make-hollow! and make-solid! commands.
+

+ +

A turtle is always connected to a certain board, which is the board +it is drawing on. To create a new turtle on a board use the make-turtle +or the clone-turtle commands. A new turtle (created with the make-turtle +command) will be black, solid, heading north and with it's pen down, in +the center of the board. A cloned turtle will have exactly the same inner +state as its parent.
+

+ +

A turtle can also look at the board and see other turtles or colors. +By using the command look the user can tell the turtle the area +in which to look and what to look in this area.

+ +

Example:

+ +

The command

+ +

(look t 50 20 '(0 0 0))

+ +

will cause the turtle t to look for black pixels in the area +in radius 50 from the turtle and 20 degrees to each side of the heading +line, shown here in blue:

+ +


+

+ +

INTERRUPTS (NOTIFICATIONS) +AND MESSAGE HANDLERS
+

+ +

A turtle can have interrupts. Each interrupt is defined in terms of +turtle's vision. Whenever a turtle starts or stops seeing a given target, +a predefined message is sent to the thread which asked the interrupt. The +user can determine if the interrupt will notify on every change (like a +"can see"- "can't see" toggle) or only when one change +happens (only "can see" or "can't see" toggle). A message +can be any valid SCHEME object.
+

+ +

Example:

+ +

The command

+ +

(turtle-notify t "I-see" "I-don't-see" 50 20 +color-black)

+ +

tells the turtle t that every time it sees the color black it +should send the message "I-see" and when it doesn't see +the color black any more it should send the message "I-don't-see". +

+ +

Below is an example of what messages (or no message) t will send +while it is moving forward, encountering two black lines on its way:
+
+
+

+ +


+
+If the interrupt was of kind "can see" (notify-when command) +only the "I-see" messages were sent, and if it was a the +"can't see" interrupt (notify-when-not command) only the +"I-can't-see" style messages were sent.
+

+ +

A special "user interrupt" is invoked when the user right-clicks +the turtle or a window. The notify-on-click command is used to enable +this.
+

+ +

A thread can tell the turtle to delete a certain interrupt using the +turtle-no-notify command. It can also tell the turtle to disable +all interrupts using the stop-notifying command.
+

+ +

In order to process the messages sent from a turtle's interrupt (or +from another thread, as presented later) the thread must install a message +handler which is a one argument function. If no handler is installed +the turtle's messages are lost. There can be only one handler per thread. +If the handler is installed then every time an interrupt is invoked, the +handler function in called with the message sent by the interrupt as its +argument.
+
+

+ +

Example:

+ +

We declare the function:

+ +

(define (my-print x) (write x) (newline))

+ +

and then install my-print as the current handler with:

+ +

(install-handler my-print)

+ +

from now on every message a turtle's interrupt sends will be printed +on screen. If my-print was installed in the previous example then +we would have seen:
+

+ +

"I-see"

+ +

"I-don't-see"

+ +

"I-see"
+

+ +

on the screen.
+

+ +

A good example to view the interrupts in action is to make a turtle +turn each time it sees a color and then let it wander aimlessly. Then use +the user pen to draw lines the turtle's way and watch it change direction. +See the PINGPONG.SCM file for a demo program.
+

+ +

The message-handler concept can be used as a mean of synchronous inter-thread +communications. The tell-thread functions sends a message to a thread, +which will be treated as an interrupt-generated message: It will cause +the thread's message handler function to be called with tell-thread's argument +as its own. This allows one thread to initiate a computation in a different +thread's environment and CPU space synchronously and without sharing environments. +
+

+ +

MESSAGE QUEUES
+

+ +

In order to let threads communicate between themselves asynchronously +a system of message queues was developed. A queue is an object which stores +and relieves messages, stored in FIFO (First In First Out) style, meaning +messages are read in the order of arrival to the queue. Supported messages +are pairs of type and body, both of which can be any valid SCHEME object. +Looking for messages of a certain type is also supported, allowing implementation +of more flexible communication schemes than plain FIFO.
+

+ +

A thread can check if there are any messages in a given queue, if it +does get-message without checking first if there are messages in +the queue it will wait a given time-out or forever if no time-out is given. +If by the end of the time-out no message were in the queue the result will +be false.
+

+ +

Example:

+ +

In this example a queue q is created then a message is posted +into the queue and read from it.
+

+ +

(define q (make-queue))

+ +

(post-message q (cons 'type-circus 'bozo-the-clown))

+ +

(define msg (get-message q))
+

+ +

now the command

+ +

(car msg)

+ +

will give

+ +

type-circus

+ +

and the command

+ +

(cdr msg)

+ +

will yield

+ +

bozo-the-clown.

+ + +

+


+
+ [TOP] + [PREV] + [PREV] + [PREV] +
+ + + + + + diff --git a/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19991006050747/~elad/GALAPAGOS/background.html b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19991006050747/~elad/GALAPAGOS/background.html new file mode 100644 index 0000000..f606cb2 --- /dev/null +++ b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19991006050747/~elad/GALAPAGOS/background.html @@ -0,0 +1,130 @@ + + + + Galapagos - Background + + + + + +

+

+ [PREV] + [PREV] + [PREV] +
+
+

+

Background

+ + + +

+

+ +

SCHEME

+ +

Scheme is a dialect of Lisp that stresses conceptual elegance and simplicity. +It is specified in R4RS and IEEE standard P1178. Scheme is much smaller +than Common Lisp; the specification is about 50 pages, compared to Common +Lisp's 1300 page draft standard. (See the Lisp FAQ for details on standards +for Common Lisp.) Advocates of Scheme often find it amusing that the entire +Scheme standard is shorter than the index to Guy Steele's "Common +Lisp: the Language, 2nd Edition".
+

+ +

Scheme is often used in computer science curricula and programming language +research, due to its ability to represent many programming abstractions +with its simple primitives.
+

+ +

There are a lot of traditional SCHEME interpreter available such as +Chez, ELK 2.1, GAMBIT, MITScheme, scheme->C, Scheme48, T3.1, VSCM and +Scm4e. Many free Scheme implementations (as well as SCM) are available +from swiss-ftp.ai.mit.edu [18.43.0.246].
+

+ +

Galapagos is built over the SCM interpreter version 4e4 written by Aubrey +Jaffer <jaffer@ai.mit.edu>.
+
+
+

+ +

LOGO AND TURTLE GEOMETRY
+

+ +

LOGO is a programming language designed for use by learners, including +children. It is a dialect of LISP which has a more natural syntax, using +infix arithmetics and (almost) no parentheses. LOGO features a "turtle" +which can be instructed to move across the screen and draw shapes. This +became known as "Turtle Graphics" or "Turtle Geometry" +- a geometry that describes paths "from within" rather than "from +outside" or "from above." For example, "turn right" +means turn right relative to whatever direction you were heading before; +by contrast, "turn east" specifies an apparently absolute direction. +A Logo user or program manipulates the graphical turtle by telling it to +move forward or back some number of steps, or by telling it to turn left +or right some number of degrees.
+

+ +

Turtle geometry has two major advantages. One is that many paths are +more simply described in relative than in absolute terms. For example, +it's easy to indicate the absolute coordinates of the corners of a square +with vertical and horizontal sides, but it's not so easy to find the corners +of an inclined square. In turtle geometry the same commands (go forward, +turn right 90 degrees, etc.) work for squares with any orientation. +The second advantage is pedagogic rather than computational: turtle geometry +is compatible with a learner's own experience of moving in the world - +it's "body syntonic."
+

+ +

OBJECTIVES
+

+ +

The two major goals behind Galapagos were:
+

+ +

First, we wanted to create an environment suitable for teaching programming, +patterned after Logo's environment and its easy-to-understand, easy-to-use +turtle geometry. We chose Scheme as the programming language because of +its educational value, as noted before. We added Turtle Graphics because +of its ability to visualize computations, and thus help understanding them +better.
+

+ +

Second, we wanted to add parallel programming. The importance of multiprocessor +machines and of multithreading is becoming more apparent every day, and +so is the need for tools to help understanding parallel programming paradigms. +By extending Scheme to be multithreaded, we wanted to create such a tool.
+

+ +

AVAILABILITY
+

+ +

Galapagos was developed to run under Windows 95, and should work under +Window NT as well. (It uses 32-bit specific code so Win32s is not enough +to run Galapagos). Both binary and source are available at the +homepage:
+

+ +

+http://www.cs.bgu.ac.il/~elad/GALAPAGOS + +

+ + +

+


+
+ [TOP] + [PREV] + [PREV] + [PREV] +
+ + diff --git a/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19991006061546/~elad/GALAPAGOS/bib.html b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19991006061546/~elad/GALAPAGOS/bib.html new file mode 100644 index 0000000..52609ac --- /dev/null +++ b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/19991006061546/~elad/GALAPAGOS/bib.html @@ -0,0 +1,81 @@ + + + + Galapagos - Bibliography + + + + +
+ [PREV] +
+
+

+ +

BIBLIOGRAPHY

+
+ +
    +
  • The +SCHEME FAQ,
    +http://www.cs.cmu.edu:8001/Web/Groups/AI/html/faqs/lang/scheme/top.html +
  • + +

  • The LOGO FAQ,
    +ftp://cher.media.mit.edu/pub/logo/FAQ +
  • + +

  • SCM manual version 4e4, Aubrey Jaffer. SCM 4e4 is available +at:
    +ftp://ftp-swiss.ai.mit.edu/pub/scm/scm4e4.tar.gz +
  • + +

  • Structure and interpretation of computer programs, +Harold Ableson and Gerald J. Sussman with Julie Sussman. +
  • + +

  • Garbage Collection, Andrew W. Appel; appeard +in Topics in Advanced Language Implementation, edited by Peter Lee.
  • +

+ +

+


+

LINKS

+

+

+

+

+


+
+ [PREV] +
+ + + + + diff --git a/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20000427155438/~elad/GALAPAGOS/img00002.gif b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20000427155438/~elad/GALAPAGOS/img00002.gif new file mode 100644 index 0000000000000000000000000000000000000000..7d0641723b94c97815ec2a5a265483d99285d787 GIT binary patch literal 6853 zcmbu8Wl+@L8}`2@BAB2wNJxjcQi6bh^nxHM9nvY?-Q6rK-Al7eBNEaJNGRQ%f^?q8 z-~aV9&zt9(xz9EC%$YgY`JDSmNQv|E>0xe`-#CH(llTA1`+w&Buk-e9`KRfY{N6n$ zMkta4%H@F?1)*VaXdMm#We8Z%0ADeHFaj09pc4gVurL}(niJ9$hMeS~NNp(B3TpI# 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 bJTHz;bi6NqIqCZ1ai8k?6NodtfcXCpYFxy} literal 0 HcmV?d00001 diff --git a/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20000427162611/~elad/GALAPAGOS/toc.gif b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20000427162611/~elad/GALAPAGOS/toc.gif new file mode 100644 index 0000000000000000000000000000000000000000..786e4c74ec91b454ac69f3571cdbd6e450079fb5 GIT binary patch literal 2417 zcmY+@Yg7|w8VB$vfk={qOu5KdwPgaB1VWlnR*1E29Hqd36$Y;nSs>IRX%!t%Z0u?v zYJ_MJ0|ktWAW`I^1dW0f3qc~67FnoNZOb8+dc|t3E!M5FuV?qm{?7mW=bdNXGiN@$ z6CL}0WJFp5B)}y67Z+d(xLm+6z;M7(2p~|zK*&KX1~F;{$mJkMO@cxJ3KB>Z3P>6# z3Md+A6cwmY)S%LUS`BK{TF@|{(E`H&qXn%Vv?kCS!Ds@b8B8b^Fq^@Qx(O^OHfTa= z2OEk5+8yZ2xCqAO5(HPnU>Fxea12u@Fp9=#8q+X1j^PM_;RKG$30y(pqyi@?T%|?> zfaG-`%YGqhSuYY>Lf=xL1}ZDANK!x&YJNv+i~T0~E2^?I#Qr9~67T5Hkh z5hJZPYxEY45iyyJX0@?NV{Bqfh(%*+(wJMGp?Lr;rcjzjkg29o zWXg8y*0bBlRQp2&^^{{0nHrb^sAEB90_;Ew0OJO9;1<`hgocFe`icXzJ6>)j-` zRxAUZL7qE&@CaZ+guxCTOsU}*9w>1`4?I1gtjyD30KgW3=QU`IfgVp!&$6;I0~)%y zE1_!`+#)w*yxiCbhMqP6_eIckljUX($oSu3|No2R(_XMx)TbB8++BsG8FT~oi;!Z^8eqigfg^bj78@J3^^ZWgn z#*E>S@S>cC8|Ng~vuyUEvLC<9`?V%4Ac}uLQX;u-Ro_VvskeEDIErZLjnblD1qaiE zzi3$1@&k;O)FsRbr`b-YciWjJM_TnimpqvF;rfhfFjoZZ>MxU3Eo;llt^d{>ZO^V? z53Z}Yd#P?;zV9pBtd{rc9pE3{cePGvU$*bH>!z?B{E4M$2=vSqb{IJcsJ+02*f zdj5#@o@WyDhnyU%q3|}t<6hBoUqMkwRo>$mouN8k=_WB3=ev16$-WW0-#X*(ySH|x z^93*#M$J)|hlxbVPk4P*M|VaPimnDdI3dt!S{!IpYcO`j0PSMa4)pK`;Sn@p?tb0PIezRRn!;waJ9KlyLOt&3NZ zoUI?r`GK51fqPIDoaVr(+WaW7J!VggbcvA_rArR%I^mHGgRji=XiR0ZW5zANB)$jk1YAAh=WuXHgC>SclZI~{(2+v75} zucMd`9wCh7 zzb_FugkP3Rx-as6u}A6BWWR0F*)v%?eKw4<3Wa}DVvG3F=Hg4~6)yk&N!D=fLl;(evY*DFj z;NoW*b9piI$nfkBoQ11R`P|R5yWd=3(=RY}VurRjp9R@0?2OW7dMbFtrFWf5>yy^X zSnlq3g8c4uN}Dk~mf!3u982@uea%%;Q;w(P__O`8J6#2`ouNZDMen@LOR0k{_OTAv zLy`N}7jM#eV`IAlnw8JauIM_vEwp%U=PTmbW9(>aYFwejgB6pl^J!Lc!UvTyQEyb- z$@{vqh7N8_D%)F6AE+zt;C5Wjj~j0+S*!io@4?VCFC)0lX#G&M(YiMx&$+qrucILa z5%FuDDqRnJtPeYPH(Hr;FM5k}7fVvi$~;yS{Jo^guamdX<%zU1JXYwU9apwqsGafj z#iiRzF08*&F`iU4&-u}NYad@xO)!<8&B~Ze5N*8A*TAtL@S@umK|T-D_*X@ z=T-H~nZU)iSX$HaZK*!zL@Xzm-Wq(hsxq*CSy27*_15L7S!ZgNwBK8?ga55{MQP(| z-(c14-qRa*mo{YWyPs&A|J`}})sxwW>r>iqD1U4BZP@l>$lBle*E*=>hnxPqpZJ?< z)p?c8TJ#_*WFvp1J8WLdYTt&`&{?axHviE)R6F6pS~Jp`HF8?tJ+W?b{`FJ)%No<) zNxr}Sit5JoKHoFK(uuW8zhB*W({?WRlX_|!b@0Vm=y* zDqiIm@J;*4EkQ#++}&b1HTrzRib`_yapk0Nmg3Z>-}R6FaelJ>(Y{lky0GEx{{TvT B=2rj! literal 0 HcmV?d00001 diff --git a/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20000429040644/~elad/GALAPAGOS/next.gif b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20000429040644/~elad/GALAPAGOS/next.gif new file mode 100644 index 0000000000000000000000000000000000000000..b8f05c3303287e656bf3bbca082232d326a6bea3 GIT binary patch literal 740 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 B=2rj! literal 0 HcmV?d00001 diff --git a/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20000927044316/~elad/GALAPAGOS/next.gif b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20000927044316/~elad/GALAPAGOS/next.gif new file mode 100644 index 0000000000000000000000000000000000000000..b8f05c3303287e656bf3bbca082232d326a6bea3 GIT binary patch literal 740 zcmV000F35XecZy*TU5L*QU2j+jTDXexQ8>b@EK zO+szoc&_h!@8>egZ%8Z}YeAYo#%wyD(5SR2L9&F)sdmeiR6m%x;F7_Y5{UXq-V~_V7 zN`)M5i*QBvs(+~>`v677@O}O*h&*fILZd@29Bt4dI8_KO45bxf&xjqI? z=Qr^=#*ec}uDp(L+s%(K|A7F(jq1dw`>1Zc26iLgr9VGigu9LKM9}XU@0q%J0pa6! zhi{$x{Pm8ZZ-4*YzIW{A`I{$Re&nTB-+}b~r=Wb!5!l{-2?E%ieD|qGgmyjj7odIf zy{8}<81kT@ggSVbAc*X}=H7WEp4j4v1J+jH5ETBm;eiuc=vGfFvdChNK7MFKh|%qM zS&=ci#v_tL5Xod^DK7bBYo0xe`-#CH(llTA1`+w&Buk-e9`KRfY{N6n$ zMkta4%H@F?1)*VaXdMm#We8Z%0ADeHFaj09pc4gVurL}(niJ9$hMeS~NNp(B3TpI# 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 bJTHz;bi6NqIqCZ1ai8k?6NodtfcXCpYFxy} literal 0 HcmV?d00001 diff --git a/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20010430130433/~elad/GALAPAGOS/index.html b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20010430130433/~elad/GALAPAGOS/index.html new file mode 100644 index 0000000..56faa74 --- /dev/null +++ b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20010430130433/~elad/GALAPAGOS/index.html @@ -0,0 +1,95 @@ + + + + Galapagos + + + +

Welcome to
+GALAPAGOS

+ +Galapagos is an interactive multithreaded Scheme interpreter with turtle +graphics for Windows 95. It is built around the SCM interpreter, and it +provides multiple interpreters, threads, turtles, and drawing boards, all +running concurrently using WIN32's multithreading abilities, and freely +available. + +

+


+

+

+

+Spring 1997

+Graduation project

+Department of Math & Computer Science,

+Ben-Gurion University of the Negev

+
+Written by Elad Eyal and Miki +Tebeka.
+
+Supervisor: Dr. Michael Elhadad +
+

+

+


+

+ +

TABLE OF CONTENTS

+ + + +

+ +
+ +

DOWNLOAD CENTER

+

+

GNU LICENSE. COPYRIGHTED. PROVIDED "AS IS". NO +WARRANTIES OR LIABILITIES. ETC.
+

+

+500K gps10bin.zip - Executable and required Scheme libraries (SLIB)
+700K gps10src.zip - Same with all source code
+400K mfc40dll.zip - You might need this MFC40.DLL if you +don't have it already.
+ + diff --git a/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20010608213604/~elad/GALAPAGOS/background.html b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20010608213604/~elad/GALAPAGOS/background.html new file mode 100644 index 0000000..f606cb2 --- /dev/null +++ b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20010608213604/~elad/GALAPAGOS/background.html @@ -0,0 +1,130 @@ + + + + Galapagos - Background + + + + + +

+

+ [PREV] + [PREV] + [PREV] +
+
+

+

Background

+ + + +

+

+ +

SCHEME

+ +

Scheme is a dialect of Lisp that stresses conceptual elegance and simplicity. +It is specified in R4RS and IEEE standard P1178. Scheme is much smaller +than Common Lisp; the specification is about 50 pages, compared to Common +Lisp's 1300 page draft standard. (See the Lisp FAQ for details on standards +for Common Lisp.) Advocates of Scheme often find it amusing that the entire +Scheme standard is shorter than the index to Guy Steele's "Common +Lisp: the Language, 2nd Edition".
+

+ +

Scheme is often used in computer science curricula and programming language +research, due to its ability to represent many programming abstractions +with its simple primitives.
+

+ +

There are a lot of traditional SCHEME interpreter available such as +Chez, ELK 2.1, GAMBIT, MITScheme, scheme->C, Scheme48, T3.1, VSCM and +Scm4e. Many free Scheme implementations (as well as SCM) are available +from swiss-ftp.ai.mit.edu [18.43.0.246].
+

+ +

Galapagos is built over the SCM interpreter version 4e4 written by Aubrey +Jaffer <jaffer@ai.mit.edu>.
+
+
+

+ +

LOGO AND TURTLE GEOMETRY
+

+ +

LOGO is a programming language designed for use by learners, including +children. It is a dialect of LISP which has a more natural syntax, using +infix arithmetics and (almost) no parentheses. LOGO features a "turtle" +which can be instructed to move across the screen and draw shapes. This +became known as "Turtle Graphics" or "Turtle Geometry" +- a geometry that describes paths "from within" rather than "from +outside" or "from above." For example, "turn right" +means turn right relative to whatever direction you were heading before; +by contrast, "turn east" specifies an apparently absolute direction. +A Logo user or program manipulates the graphical turtle by telling it to +move forward or back some number of steps, or by telling it to turn left +or right some number of degrees.
+

+ +

Turtle geometry has two major advantages. One is that many paths are +more simply described in relative than in absolute terms. For example, +it's easy to indicate the absolute coordinates of the corners of a square +with vertical and horizontal sides, but it's not so easy to find the corners +of an inclined square. In turtle geometry the same commands (go forward, +turn right 90 degrees, etc.) work for squares with any orientation. +The second advantage is pedagogic rather than computational: turtle geometry +is compatible with a learner's own experience of moving in the world - +it's "body syntonic."
+

+ +

OBJECTIVES
+

+ +

The two major goals behind Galapagos were:
+

+ +

First, we wanted to create an environment suitable for teaching programming, +patterned after Logo's environment and its easy-to-understand, easy-to-use +turtle geometry. We chose Scheme as the programming language because of +its educational value, as noted before. We added Turtle Graphics because +of its ability to visualize computations, and thus help understanding them +better.
+

+ +

Second, we wanted to add parallel programming. The importance of multiprocessor +machines and of multithreading is becoming more apparent every day, and +so is the need for tools to help understanding parallel programming paradigms. +By extending Scheme to be multithreaded, we wanted to create such a tool.
+

+ +

AVAILABILITY
+

+ +

Galapagos was developed to run under Windows 95, and should work under +Window NT as well. (It uses 32-bit specific code so Win32s is not enough +to run Galapagos). Both binary and source are available at the +homepage:
+

+ +

+http://www.cs.bgu.ac.il/~elad/GALAPAGOS + +

+ + +

+


+
+ [TOP] + [PREV] + [PREV] + [PREV] +
+ + diff --git a/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20010608214537/~elad/GALAPAGOS/bib.html b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20010608214537/~elad/GALAPAGOS/bib.html new file mode 100644 index 0000000..52609ac --- /dev/null +++ b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20010608214537/~elad/GALAPAGOS/bib.html @@ -0,0 +1,81 @@ + + + + Galapagos - Bibliography + + + + +
+ [PREV] +
+
+

+ +

BIBLIOGRAPHY

+
+ +
    +
  • The +SCHEME FAQ,
    +http://www.cs.cmu.edu:8001/Web/Groups/AI/html/faqs/lang/scheme/top.html +
  • + +

  • The LOGO FAQ,
    +ftp://cher.media.mit.edu/pub/logo/FAQ +
  • + +

  • SCM manual version 4e4, Aubrey Jaffer. SCM 4e4 is available +at:
    +ftp://ftp-swiss.ai.mit.edu/pub/scm/scm4e4.tar.gz +
  • + +

  • Structure and interpretation of computer programs, +Harold Ableson and Gerald J. Sussman with Julie Sussman. +
  • + +

  • Garbage Collection, Andrew W. Appel; appeard +in Topics in Advanced Language Implementation, edited by Peter Lee.
  • +

+ +

+


+

LINKS

+

+

+

+

+


+
+ [PREV] +
+ + + + + diff --git a/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20010608215359/~elad/GALAPAGOS/extensions.html b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20010608215359/~elad/GALAPAGOS/extensions.html new file mode 100644 index 0000000..67d97f1 --- /dev/null +++ b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20010608215359/~elad/GALAPAGOS/extensions.html @@ -0,0 +1,493 @@ + + + + Galapagos - Scheme Extensions + + + + + +
+ [PREV] + [PREV] + [PREV] +
+
+

+ +

SCHEME EXTENSIONS
+

+ + + +

+


+ +

We have extended Scheme in two main +directions: Turtle graphics and multithreading:
+

+ +

The turtle object lives on a board on which it can move and draw. +A turtle can also communicate with the board and "see" colors +or other turtles. Galapagos Scheme provides a set of primitives to create +and manage such turtles and the boards they live on.
+

+ +

A set of additional primitives enable the programmer to create multiple +interpreters that run concurrently. The environment model was extended +to support shared or thread-specific environments, and primitives to handle +multiple environments were also added.
+
+

+ +

THE NEW ENVIRONMENT MODEL
+

+ +

A frame is a table which maps (or binds) names to values. An +environment is a chained list of frames in which the interpreter works. +

+ +

For example the command:

+ +

(define x 7)

+ +

creates a binding between x and the value 7.

+ +

A typical environment looks like this:

+ +

+
+

+
+
+
+Each rectangle denotes a frame and inside it are the bindings it holds. +The rightmost rectangle is the global environment.
+

+ +

When a variable is evaluated, the interpreter first tries to find it +in the current frame. If a suitable binding can't be found, the interpreter +moves to the next frame in the environment and searched for a binding there.
+

+ +

In our example if we write x in the command line we'll get 12 +as the answer because all such computations take place at the global environment. +
+

+ +

A function application is always evaluated with respect to the environment +the in which it was defined. (A function "holds" its environment, +hence the name "closure") This means that if we write

+ +

(define (f) x)

+ +

and then

+ +

(f)

+ +

the result will be

+ +

12.
+
+
+
+
+

+
+

+
+In traditional SCHEME we have only one interpreter running at a time, so +at a given point of calculation there is only one environment. In Galapagos +multiple interpreters can run at the same time, and each of them has its +own environment.
+

+ +

Under Galapagos's environment model, every interpreter works on its +branch of an "environments tree", but can also evaluate an expression +in any other environment in the tree. If two interpreters have a shared +node on the tree, then from that point up (towards the global environment) +all the bindings are the same for the two interpreters. The global environment +is shared by all interpreters. If an interpreter changes the value of some +variable, the binding is changed in all other interpreters that have access +to the frame where the variable was declared. Obviously, caution should +be taken when writing to a shared variable.
+

+ +

As an example, if a user created two new threads, called A and B, and +then evaluated:

+ +

First thread> (define +x 7)

+ +

(define (f) ...)

+ +

Thread A> (define (g) +x)

+ +

Thread B> (define x 4) +

+ +

this is how the environment model would look like:
+

+ +


+

+ +

Now consider what happens when the user evaluates this:

+ +

Thread A> (set! f g) +

+ +


+
+

+ +

Now, evaluating (f) in thread B will call the function defined +in thread A. It will return 12 which is the value of x in f's environment. +If thread A defines a new x (using define), it will affect the result +of subsequent calls to f.
+

+ +

Sharing environments and frames are Galapagos's way of allowing shared +data. By default, however, most calculations are done at thread-specific +frames. (More on this subject in the next section). Primitives are supplied +to explicitly reference and manage environments: clone-environment +can create a copy of an environment (so changing a binding in one copy +does not alter the other); extend-environment and pop-environment +can add and remove frames to and from environments. More environment functions +are found in the next section of this document.
+

+ +

THREADS
+

+ +

A thread is a SCHEME interpreter. The base environment of a thread +is the thread's topmost environment. All forms entered at the thread's +console or as arguments to new-thread are evaluated in the base +environment. In traditional SCHEME there is only one thread of execution. +It is a single thread and its base environment is the global environment. +In Galapagos many interpreters can run concurrently, and each have its +own environment (changing dynamically as computation progresses) and a +base environment (which can be explicitly changed).
+

+ +

One thread is created by Galapagos upon startup. It is called the main +thread, and it lasts for the whole Galapagos session. Its base environment +is the global one - much like a traditional Scheme interpreter. Additional +threads can be created using new-thread. These have their base environment +set to a new environment, containing a single fresh frame pointing to the +global environment. Any calculation done at the new thread's console takes +place in this thread-local environment. However, if closure functions are +used, then their evaluation may take place at the global environment or +at some other thread's space, depending on where that function was defined. +
+

+ +

When a thread finishes the execution of its commands it terminates. +There are two exceptions to this rule:

+ +
    +
  1. The main thread can be only terminated by using quit-program. +
  2. + +
  3. A thread that is bound to the console will not terminate at the end +of execution but will wait for the next command input.
  4. +
+ +

Threads can communicate using the predicate tell-thread or by +using the asynchronous message-queues system described later. In addition, +SCM's arbiters were improved to be multithread safe. An arbiter +object can serve as a guard on a critical section (where only one thread +can work at a given time) of the program. The relevant primitves are make-arbiter, +try-arbiter, and release-arbiter.
+

+ +

Note: Galapagos supports Scheme's notation of continuations. +However, two restrictions apply:

+ +
    +
  1. Only "cheap" continuations are supported. That is, a continuation +can only be called when it is still active. This allows for continuations +to be used to implement exception handling, etc.
  2. + +
  3. Continuations can not cross thread boundaries. Also continuations, +like any other Scheme object, can be handled by any thread, they can only +be called from within the thread that created them. Trying to call a continuation +from a different thread will cause an error.
  4. +
+ +

CONSOLES
+

+ +

A console is a text window where the user can type commands (when +the interpreter is idle) and see output. A console has a name which can +be changed dynamically, which appears on its title bar. A thread may or +may not be bound to a console. Information printed by a non-bound thread +is lost; a non-bound thread waiting for input is stuck (unless provisions +were made to allow a new console to be created by means of inter-thread +communications.) If a non-bound thread has nothing to do, instead of waiting +for input like a bound thread, it will terminate.
+

+ +

The main thread is always bound to a console. To bind a thread to a +console use the command bind-to-console from within the thread.
+

+ +

DRAWING BOARDS
+

+ +

A board (window) is the graphical board on which the turtles and the +user draw. It is a bitmap on which the user can draw interactively, by +using the supplied GUI, or by creating turtles and instructing them to +do the drawings.
+

+ +

The controls of the graphical user interface are located on the toolbar. +The "shapes" of drawing are either a rectangle, a line or free +hand drawing. The user pen can have three widths which are found under +the User Pen menu. The numbers next to the sizes are the widths +in pixels.
+

+ +

The colors of the user pen can be changes either from the User Pen +menu or from the toolbar's color buttons. When choosing from a toolbar +button, the user can know exactly what color (in RGB format) is used.
+

+ +

Each window has a name which is written on its title bar which can be +changed using the rename-window! command. The board can be cleaned +from all drawings using the clear-window command.
+

+ +

Since the board is a bitmap it can be saved to a BMP file using the +save-bitmap command. A new background from a bitmap file can be +loaded using the load-bitmap command.
+

+ +

TURTLES
+

+ +

A turtle is an object which is connected to a certain board. Each turtle +has a pen with which it can draw on that board. The user can change the +state of the turtle's pen including giving it the color of the board's +background color (using the pen-erase! command). The pen will draw +when it is "down" and will not draw when it is "up". +Turtles can move between boards using the move-turtle-to-window +command.
+

+ +

Each turtle holds its location as the a pair of coordinates where 0,0 +is the upper left corner of the board and 800,600 is the bottom-right corner +of the board. The turtle's location can be changed by giving the turtle +commands such as forward!, backwards!, move-to! or by using the +move button from the toolbar.
+

+ +

A turtle also has a heading which is the direction it will move on the +forward! command. The heading is in degrees, 0 meaning upwards and +increasing clockwise, thus 90 means rightwards and so on. A turtle's heading +can be changed by commands such as right!, left!, and set-heading! +or interactively, by using the move button on the toolbar and pressing +the control key.
+

+ +

A turtle can be visible on the board or be hidden. When it is visible +the user can decide if it wants a "solid" or "hollow" +turtle using the make-hollow! and make-solid! commands.
+

+ +

A turtle is always connected to a certain board, which is the board +it is drawing on. To create a new turtle on a board use the make-turtle +or the clone-turtle commands. A new turtle (created with the make-turtle +command) will be black, solid, heading north and with it's pen down, in +the center of the board. A cloned turtle will have exactly the same inner +state as its parent.
+

+ +

A turtle can also look at the board and see other turtles or colors. +By using the command look the user can tell the turtle the area +in which to look and what to look in this area.

+ +

Example:

+ +

The command

+ +

(look t 50 20 '(0 0 0))

+ +

will cause the turtle t to look for black pixels in the area +in radius 50 from the turtle and 20 degrees to each side of the heading +line, shown here in blue:

+ +


+

+ +

INTERRUPTS (NOTIFICATIONS) +AND MESSAGE HANDLERS
+

+ +

A turtle can have interrupts. Each interrupt is defined in terms of +turtle's vision. Whenever a turtle starts or stops seeing a given target, +a predefined message is sent to the thread which asked the interrupt. The +user can determine if the interrupt will notify on every change (like a +"can see"- "can't see" toggle) or only when one change +happens (only "can see" or "can't see" toggle). A message +can be any valid SCHEME object.
+

+ +

Example:

+ +

The command

+ +

(turtle-notify t "I-see" "I-don't-see" 50 20 +color-black)

+ +

tells the turtle t that every time it sees the color black it +should send the message "I-see" and when it doesn't see +the color black any more it should send the message "I-don't-see". +

+ +

Below is an example of what messages (or no message) t will send +while it is moving forward, encountering two black lines on its way:
+
+
+

+ +


+
+If the interrupt was of kind "can see" (notify-when command) +only the "I-see" messages were sent, and if it was a the +"can't see" interrupt (notify-when-not command) only the +"I-can't-see" style messages were sent.
+

+ +

A special "user interrupt" is invoked when the user right-clicks +the turtle or a window. The notify-on-click command is used to enable +this.
+

+ +

A thread can tell the turtle to delete a certain interrupt using the +turtle-no-notify command. It can also tell the turtle to disable +all interrupts using the stop-notifying command.
+

+ +

In order to process the messages sent from a turtle's interrupt (or +from another thread, as presented later) the thread must install a message +handler which is a one argument function. If no handler is installed +the turtle's messages are lost. There can be only one handler per thread. +If the handler is installed then every time an interrupt is invoked, the +handler function in called with the message sent by the interrupt as its +argument.
+
+

+ +

Example:

+ +

We declare the function:

+ +

(define (my-print x) (write x) (newline))

+ +

and then install my-print as the current handler with:

+ +

(install-handler my-print)

+ +

from now on every message a turtle's interrupt sends will be printed +on screen. If my-print was installed in the previous example then +we would have seen:
+

+ +

"I-see"

+ +

"I-don't-see"

+ +

"I-see"
+

+ +

on the screen.
+

+ +

A good example to view the interrupts in action is to make a turtle +turn each time it sees a color and then let it wander aimlessly. Then use +the user pen to draw lines the turtle's way and watch it change direction. +See the PINGPONG.SCM file for a demo program.
+

+ +

The message-handler concept can be used as a mean of synchronous inter-thread +communications. The tell-thread functions sends a message to a thread, +which will be treated as an interrupt-generated message: It will cause +the thread's message handler function to be called with tell-thread's argument +as its own. This allows one thread to initiate a computation in a different +thread's environment and CPU space synchronously and without sharing environments. +
+

+ +

MESSAGE QUEUES
+

+ +

In order to let threads communicate between themselves asynchronously +a system of message queues was developed. A queue is an object which stores +and relieves messages, stored in FIFO (First In First Out) style, meaning +messages are read in the order of arrival to the queue. Supported messages +are pairs of type and body, both of which can be any valid SCHEME object. +Looking for messages of a certain type is also supported, allowing implementation +of more flexible communication schemes than plain FIFO.
+

+ +

A thread can check if there are any messages in a given queue, if it +does get-message without checking first if there are messages in +the queue it will wait a given time-out or forever if no time-out is given. +If by the end of the time-out no message were in the queue the result will +be false.
+

+ +

Example:

+ +

In this example a queue q is created then a message is posted +into the queue and read from it.
+

+ +

(define q (make-queue))

+ +

(post-message q (cons 'type-circus 'bozo-the-clown))

+ +

(define msg (get-message q))
+

+ +

now the command

+ +

(car msg)

+ +

will give

+ +

type-circus

+ +

and the command

+ +

(cdr msg)

+ +

will yield

+ +

bozo-the-clown.

+ + +

+


+
+ [TOP] + [PREV] + [PREV] + [PREV] +
+ + + + + + diff --git a/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20010608220120/~elad/GALAPAGOS/gui.html b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20010608220120/~elad/GALAPAGOS/gui.html new file mode 100644 index 0000000..a6c0244 --- /dev/null +++ b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20010608220120/~elad/GALAPAGOS/gui.html @@ -0,0 +1,73 @@ + + + + Galapago - GUI + + + + + +
+ [PREV] + [PREV] + [PREV] +
+
+

+ +

THE INTERACTIVE GUI

+
+

In order to make Galapagos more fun to learn with, an interactive GUI +(Graphical User Interface) is provided. Users can make changes on the board +while a computation is in progress and effect its execution. Drawing tools +enable the user to draw on the board while a program is being executed. +If a line is drawn in front of a turtle which has a relevant interrupt, +the interrupt will be invoked if needed.
+

+ +

The user has a special user pen that can draw line, rectangles +or free hand. These modes are available from the toolbar. The User's pen +width and color can be modified using the User Pen menu or the toolbar.
+

+ +

Color buttons are provided on the toolbar to give a known RGB color +to the user pen. It is useful when the user draw an object on the board +and wants a turtle to see this object. The colors are:

+ +

White - (255 255 255)

+ +

Black - (0 0 0)

+ +

Blue - (0 0 255)

+ +

Red - (255 0 0)

+ +

Green - (0 255 0)

+ +

Yellow - (255 255 0)
+

+ +

Another option available is changing a turtle's heading and position, +using the Move Turtle button:

+ +


+

+ +

If this button is pressed then a turtle can be dragged to a new location +simply by dragging it with the mouse. In order to change the turtle's heading, +hold down a control key and move the move towards the desired location, +the turtle will follow the movement of the mouse.

+ +

+


+
+ [TOP] + [PREV] + [PREV] + [PREV] +
+ + + + + diff --git a/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20010608220848/~elad/GALAPAGOS/implementation.html b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20010608220848/~elad/GALAPAGOS/implementation.html new file mode 100644 index 0000000..822f9b9 --- /dev/null +++ b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20010608220848/~elad/GALAPAGOS/implementation.html @@ -0,0 +1,393 @@ + + + + Galapagos - Implementation + + + + + +
+ [PREV] + [PREV] + [PREV] +
+
+

+ +

IMPLEMENTATION

+ + + +
+

Galapagos was written using Microsoft Visual C++, and is designed to +run under Windows 95. We chose Windows 95 because it seems to have the +largest potential Galapagos users base. The following sections describe +some implementation details of Galapagos.
+

+ +

The SCM interpreter we used as a base is written in C. Most of the original +code we added was written in C++. The parts we used from SCM are almost +identical to the original. In fact, by changing the scmconfig.h file (which +contain machine-specific configuration) and #defining THREAD to be null, +the C files should become equivalent to the sources we used.
+

+ +

We have implemented two MT-safe FIFO message queue classes. Both will +block when trying to read from an empty queue. CMsgQx, the extended +message queue, supports the same interface as the one provided in Scheme, +plus an additional support for "Urgent Messages". These take +precedence over all other messages. CMessageQueue is message queue +with exactly the same interface as the Scheme level message queues, but +which contain internal logic to handle "Urgent" messages used +to deal with cases where synchronous respond is needed, such as I/O, Garbage +collection, and Scheme-level inter-thread communications.
+

+ +

FITTING SCM INTO WINDOWS
+

+ +

Galapagos is based on SCM, which is a single-thread, read-evaluate-print-loop +(repl) based Scheme interpreter. The most important issue in migrating +SCM was how to maintain the interpreter's natural repl-based approach, +yet allow for multiple threads to interact, and for Windows messages to +be processed quickly.
+

+ +

We used WIN32's multithreading capabilities to solve these problems. +A single thread handles all aspects of the GUI - in a sense, "all +that is Windows": graphic boards, turtles, consoles, menus and so +on. Each interpreter runs in a thread of its own, interacting with the +GUI using a message queue similar to the one provided at the Scheme level.
+

+ +


+

+ +

The GUI thread manages both commands received from the OS and from the +different interpreters running on their own threads. To ensure as fast +responses as possible, priorities are used: OS messages (such as windows +updates and input devices) gets highest priority; Console (text messages) +come second, and graphics messages are last. This allows the interpreters +to run interactively in a satisfactory manner.
+

+ +

SCM interpreter threads each run in the old-fashion repl mode. When +a computation is over, the interpreter blocks until new input comes from +the GUI thread. All blocking functions were modified to allow synchronous +messages (such as the one generated by tell-thread) to work. In +addition, SCM's "poll routine" is used to force checking for +such messages even during computations.
+

+ +

An additional thread is used for Garbage Collection. It is described +in detail in the section dealing with garbage collection.
+

+ +

GARBAGE COLLECTION

+ +

In this section we will briefly describe SCM's garbage collector, and +then discuss the modifications done to adapt it to Galapagos's multithreading +computations. It should be noted that the garbage collector used is a portable +garbage collector taken from "SCHEME IN ONE DEFUN, BUT IN C THIS TIME", +by George J Carrette <gjc@world.std.com>.
+

+ +

SCM uses a conservative Mark & Sweep garbage collector (GC). All +Scheme data objects share some common configuration (called "cells"): +They are 8-byte aligned; they reside is specially-allocated memory segments +(called hplims); they are the size of two pointers (so a scheme cons is +exactly a cell); and they contain a special GC bit used by the garbage +collector. This bit is 0 during actual computations. When a new cell is +needed and all the hplims are used, garbage collection is initiated. If +it does not free enough space to pass a certain threshold, a new hplim +is allocated.
+

+ +

The first stage in garbage collection is marking all cells which are +not to be deleted. Some terminology might be helpful here:
+

+ +
    +
  • A cell (or any data object) is called alive if it may +in some way influence the future of the computation. Needless to say, discovering +which cells are alive and which are not is impossible, because of the very +nature of the future.
  • +
+ +
    +
  • A cell is called reachable if the computation can read +its value. Some data is immediately reachable: The data on the machine's +stack or in the CPU registers, for example; some interpreters store some +information in a fixed location so it's permanently reachable. In SCM the +array sys_protects[] is used for +this propose. The set of reachable cells is the union of all immediately +reachable cells, and all those cells pointed by reachable cells, recursively. +
  • +
+ +

Obviously, all unreachable data is dead. Conservative garbage collectors +treat all reachable data as alive.
+

+ +

The Mark stage of the garbage collector scans the sys_protects[] +array and the machine's stack and registers for anything that looks like +a valid cell. All cell pointer have their 3 least significant bits zero, +and are in one of few known ranges (the hplims). The garbage collector +searches for anything matching a cell's bit pattern, and treats it as an +immediately reachable cell pointer. In some cases, this may mean an integer, +for example, happens to match the binary pattern and thus be interpreted +as a cell pointer. However, this will only mean some cell or cells are +marked as reachable though they are not such. Because of the uniform structure +of the cell and its limited range of possible locations, such an accident +is guarantied not to corrupt memory. Furthermore, if we accept the assumption +that integers are usually relatively small, and memory addresses are relatively +big, we conclude that such accidents are not very likely to happen often +anyway.
+

+ +

During mark stage, the garbage collector recursively finds (a superset +of) all live cells, and marks them by setting their special GC bit to 1. +The second stage is the Sweep stage, in which all the hplims are scanned +linearly, and every cell which is not marked is recognized as dead, and +as such is reclaimed as free. Marked cells get unmarked so they are ready +for the next garbage collection.
+

+ +

Mark & Sweep garbage collection has two main disadvantages: One, +that it requires all computation to stop while garbage collection is in +progress. In Galapagos, since all threads use a shared memory heap, it +means all threads must synchronize and halt while garbage is collected. +Second, Mark & Sweep is very likely to cause memory fragmentation. +However, since cells are equally sized, fragmentation is only rarely a +problem.
+

+ +

We chose to stick with Mark & Sweep in Galapagos because of its +two major advantages: Simplicity and efficiency. Mark & Sweep GC does +not affect computation speed, because direct pointers are used. Most concurrent +garbage collectors work by making all pointers indirect, which may slow +computations down considerably. The need to halt all threads for GC is +accepted. Since memory is shared, it would only be fair to stop all threads +when GC is needed: Threads will probably halt anyway since cells are allocated +continuously during computations.
+

+ +

Two major issues are introduced when trying to multithread the garbage +collector. One is the synchronization of the different threads, which run +almost completely unaware one of the other; the second is the need to mark +data from every thread's specific stack, registers, and sys_protects[]. +We solved these two issues by combining them to one.
+

+ +

The intuitive approach might be to let each thread mark its own information, +and then sweep centrally. However, since synchronization of threads is +mandatory, letting every thread mark its own data will lead only to redundant +marking and to excessive context switches, since each threads has to become +active. Therefore we created the "Garbage Collection daemon" +(GCd), which runs in a distinct thread and lasts for the whole Galapagos +session. The GCd is not an interpreter, but a mechanism which keeps track +of live threads and their need of GC. The GCd thread is always blocked, +except when a thread notifies it on its birth or death, or when a thread +indicates the need for garbage collection. Since the GC daemon is blocked +whenever it is not needed, and then becomes the exclusive running thread +during actual GC (with the exception of the GUI thread), its existence +does not hurt performance.
+

+ +

To explain how the GCd synchronizes all threads, let us examine the +three-way protocol involved. freelist +is a global pointer which holds a linked list of free cells - it can be +either a cell pointer, a value indicating "busy" (thus implementing +busy/wait protection over it) or "end of memory" which is found +at the end of the linked list. MIB stands for Memory Information +Block, which is a block of memory containing all of a thread's +immediately reachable data.
+

+ +

GCd scenario: GCd is blocked until a threads sends a GC +request.

+ +
    +
  1. GCd scans through its list of active threads, and sends each a MIB +request.
  2. + +
  3. It then blocks until all MIB blocks are received. GCd ignores further +GC request messages it get.
  4. + +
  5. At this point all threads are blocked. The GCd has gained, therefore, +exclusive access to the hplims. The GCd now marks all reachable cells, +inspecting each MIB block for immediately reachable cells and proceeding +recursively. Then, it sweeps.
  6. + +
  7. If needed, the GCd allocated a fresh hplim.
  8. + +
  9. GCd sends every thread a message allowing it to resume. Then it blocks +waiting for the next time.
  10. +
+ +

Scenario 1: A thread needs to allocate a cell but can't. +

+ +
    +
  1. The thread sends GCd a GC request message.
  2. + +
  3. Then it suspends until GCd sends it an MIB request.
  4. + +
  5. When one arrives, the thread generates and sends a MIB block to the +GCd.
  6. + +
  7. And blocks again until GCd notifies it that GC is done.
  8. + +
  9. At this point free cells are available and the computation can resume. +
  10. +
+ +

Scenario 2: A thread receives a MIB request. This +may happen within a computation or when considered otherwise blocked - +waiting for input, for example.

+ +
    +
  1. The thread generates and sends a MIB block to the GCd.
  2. + +
  3. And blocks until GCd notifies it that GC is done.
  4. +
+ +

The important thing to note about this protocol is its indifference +to the GC "initiator". Several threads can "initiate" +GC, and each request is "satisfied", although of course only +one GC takes place. The GCd itself is unaware of the initiating thread +identity, and completely ignores any further GC requests. It treats all +threads identically. This is important because it allows each thread meeting +a low memory condition to initiate GC immediately. This is in fact the +mechanism which saves us from explicitly checking for a third-party GC +request during computation: If a thread runs out of memory, the freelist +variable is kept at "out of memory" state, causing any other +thread trying to allocate memory to initiate GC as well. This simplifies +the GC protocol (technically, if not conceptually), and does it with almost +no affect on computation speed.
+

+ +

BOARDS
+

+ +

A board or a view as it called in MFC is the environment where a turtle +moves and interact with. It hold two main data structures. The first is +the bitmap of the drawing. It is a 800X600 bitmap. Every time a turtle +draws on the board it makes its pen the active pen on the board and draws +on it. Every time the picture needs refreshing (as signaled by the operating +system) it is the board's duty to copy the relevant section from the bitmap +to the screen. The second data object is the turtles list, an expandable +array of turtles which holds pointers to all turtles on the specific board.
+

+ +

The most important part in the board's work is to notify the turtles +on any event that happened on the board such as drawing, changing background +or moving of a turtle. If for example a user draws a line on the board, +the board (after drawing the line) goes through the turtles list and tell +each one that some event happened at a rectangle that contains the line. +Each turtle will decide if this has any importance to it or not.
+

+ +

Apart from that, the board handles all the user interface from the menus +and the toolbar. The most obvious example is the move turtle button, which, +when pressed, causes the board to find a turtle close enough to the click's +location. Then, on every movement of the mouse it gives the turtle a command +to move to this point.
+

+ +

In order to support scrolling of the picture, we derived the CBoardView +class from CScrollView. The interface with the interpreter threads +is done via a message queue. The main function is ReadAndEval, +which gets a message and then interprets its and act upon the result.
+

+ +

TURTLES
+

+ +

In addition to a pointer to its current board, and to inner-state variable +which affects its graphical aspects, every turtle holds an expandable array +of interrupts. When a turtle gets from the window that a message signifying +that some change has happened, it sends this change to each of its interrupts +(only if the interrupt flag is on) and the interrupt is responsible to +send an appropriate message if necessary. The turtle's location are stored +as floating points on x,y axes, to allow for accuracy on the turtle's location +and heading.
+

+ +

The turtles interacts with the interpreter thread using a message queue. +As with the board, the main function here is the ReadAndEval, +which translates these messages to valid function calls.
+

+ +

VISION
+

+ +

Every turtle holds a pointer to the bitmap it is drawing on. When it +is "looking" for a color it calculates the minimal rectangle +that holds the desired area. Then it iterates on all the pixels in this +rectangle. First it checks if the pixel is in the vision area using the +sign rule to determine if a point is clockwise or anti clockwise from a +line, and then check for distance. If the point is in the relevant area +the turtle gets its color from the bitmap and compares it with the sought +color.
+

+ +

When looking for a specific turtle, the turtle gets this turtle's position +and calculates if this location is in the relevant area using the same +algorithm. When looking for any turtle, the turtle passes the relevant +arguments to the view, which then uses the same algorithm for each turtle +on its turtles array.
+

+ +

INTERRUPTS
+

+ +

Each turtle holds an expandable array of interrupts. Each interrupts +is an object that is much like a turtle vision. The interrupts has the +view area argument and what it is looking for. It also has the message +it needs to send and a pointer to the given queue. When the turtle notifies +the interrupt that a change has happened, the interrupt first checks if +the change is an area which is of interest to it. If so it calls the turtle +look function with its location and the sought object. According to the +turtle's answer and to the data stored inside the interrupt, the interrupt +sends the needed message, if any.
+
+

+ +

CLASS ORGANIZATION
+

+ +


+
+

+ +

Message-passing mechanisms:
+

+ +

+

+ + + +

+


+
+ [TOP] + [PREV] + [PREV] + [PREV] +
+ + + + + + diff --git a/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20010608221151/~elad/GALAPAGOS/manual.html b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20010608221151/~elad/GALAPAGOS/manual.html new file mode 100644 index 0000000..030d010 --- /dev/null +++ b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20010608221151/~elad/GALAPAGOS/manual.html @@ -0,0 +1,1404 @@ + + + + Galapagos - Programmer's Manual + + + + + +
+ [PREV] + [PREV] + [PREV] +
+
+

+ +

PROGRAMMER'S MANUAL:
+NONSTANDARD PRIMITIVES

+ +
+ +

+


+ +

Welcome to Galapagos Scheme. This chapter is intended +as a quick reference to Galapagos's extensions over traditional Scheme. +Knowledge of Scheme is assumed. Galapagos Scheme is compliant with both +R4RS and IEEE standard P1178. If you've read the chapter titled +"Scheme extensions", you can and should skip the short introduction +in each section. This complete chapter appears as on-line help in Galapagos, +just a F1 click away.
+

+ +

+

+ +

ENVIRONMENTS
+

+ +

An environment is a list of frames, +with the global environment in its tail. A frame is a list +of bindings, which map variables to their values. (define...) +adds a binding to the frame at the top of the current environment. +(set!...) family of commands modify +an existing binding, in the frame where it was defined. When a variable +is referenced, the current environment is searched from head to tail, and +the first binding found dictates the value of the variable.

+ +

The first interpreter, which pops up as Galapagos +is started, runs at the global environment (the way traditional Scheme +works). Additional interpreters (threads) run at distinct environments, +which contain a single initially empty frame, and a pointer to the global +environment.
+
+

+ +

(clone-environment +env [depth])
+

+ +

Clone-environment will make an exact copy of the +environment env, by copying its frames +one by one. If depth is specified then the new environment will be the +collection of frames which is up to depth +frames from the current frame. And the last frame will point to the depth ++ 1 frames from the current one in env. +
+

+ +

This means that if we are now in environment e1 +and done (define x 7). Then if we'll +write

+ +

(define e2 (clone-environment +(current-environment))),

+ +

the result of

+ +

(eval@ e2 x) +

+ +

will return 7.
+

+ +

But if we are not in a lower frame than the one +x was defined in and write

+ +

(define e2 (clone-environment +(current-environment) 1))

+ +

and write the value of x is undefined.

+ +

(Unless it was defined in the global environment) +
+

+ +

Note: Only the bindings are copied. The bound values +are not. Example:

+ +

(define x (cons 1 2)) +

+ +

(define e (clone-environment +(current-environment)))

+ +

(eval@ e (set-cdr! X 6)) +

+ +

will change the 2 into 6 at both environments. +However,

+ +

(set! x 7) +

+ +

will only affect one copy.
+

+ +

(pop-environment +env)
+

+ +

Returns the current environment without the first +frame. This means the first frame on the list of frames is "popped" +out.

+ +

If env was +made from f3->f2->f1->Global, the result will be f2->f1->Global. +

+ +

(fx means frame number x)

+ +

Example:

+ +

(define e2 (pop-environment +(current-environment)))
+

+ +

(extend-environment +env)
+

+ +

Extends env with +a new empty frame (where nothing is defined yet).

+ +

This means the if env +was f2->f1->Global the result will be f3->f2->f1->Global. +

+ +

(fx means frame number x)

+ +

Example:

+ +

(define e2 (extend-environment +(current-environment)))
+

+ +

(current-environment) +
+

+ +

Returns the current environment.
+

+ +

(environment? +env)
+

+ +

A predicate that is true if env +is an environment.

+ +

Example:

+ +

(environment? (current-environment)) +

+ +

Will return true.
+

+ +

(parent-environment) +
+

+ +

Returns the parent environment. This is the environment +where (new-thread) was called to create +this thread. The First thread returns the global environment.

+ +

Example:

+ +

(eval@ (parent-environment) +y)

+ +

Will return the value of y in the parent environment.
+

+ +

(base-environment) +
+

+ +

The environment where the interpreter runs.
+

+ +

(set-base-environment +env)
+

+ +

Sets the base environment (where the interpreter +runs) to be env

+ +

Example:

+ +

(set-base-environment +(parent-environment))

+ +

Will make this thread run in the same environment +as its father)
+

+ +

(eval@ env forms...) +
+

+ +

Evaluates forms in given environment.

+ +

Example:

+ +

(define x 7) +

+ +

(define e2 (clone-environment +(current-environment)))

+ +

(eval@ e2 x)
+

+ +

The result will be 7
+

+ +

(eval@p forms...) +
+

+ +

Evaluates forms in parent environment.

+ +

Example:

+ +

Say we want to make our turtle walk 30 degrees +more than the father's turtle. Then we can write:

+ +

(set-heading! T (+ 30 +(eval@p (turtle-heading t))))
+

+ +

MESSAGE QUEUES
+

+ +

Message queues are MT-safe mechanisms used to pass +messages, possibly between threads. Messages accepted must be cons, its +car being the message type and the cdr is the message body. Both can be +any kind of Scheme object.
+
+

+ +

(make-queue) +

+ +

Creates a new message queue.

+ +

Example:

+ +

(define q (make-queue)) +
+

+ +

(message-queue? +q)

+ +

A predicate that is true if q +is a queue.

+ +

Example:

+ +

(message-queue? q)

+ +

Will return true for q from the previous example.
+

+ +

(peek-message +q [type])
+

+ +

Return true if there is a message (of given type, +or of any type if unspecified) in the queue q. +

+ +

Example:

+ +

(peek-message q) +

+ +

Will return falsif the queue q is empty. +

+ +

Note: types are compared using (equals?) +.
+

+ +

(post-message +q typ_msg)
+

+ +

Posts the message typ_msg +to the queue q.

+ +

typ_msg must +be a cons (type . message).

+ +

Example:

+ +

(post-message q (cons +'type-welcome 'hello))
+

+ +

(get-message [time-out] +q [type])
+

+ +

Get message from queue q +, if time-out is defined +waits only time-out seconds, and

+ +

optionally gets only messages from type type. +

+ +

Example:

+ +

(define msg (get-message +7 q 'type-welcome))

+ +

The result will be (if the previous posting was +done) ('type-welcome . 'hello)

+ +

Note: types are compared using (equals?) +.
+

+ +

WINDOW COMMANDS
+
+

+ +

A window is the graphical board on which the turtles +and the user draw. It is a bitmap of size 800x600.
+
+

+ +

(new-window [name]) +
+

+ +

Makes a new window, name +is a symbol or a string which will also be the window's title. The window's +color will be white and it's size 800x600.

+ +

Example:

+ +

(define w (new-window +'my-window))

+ +

Will create a new window with the title my-window. +
+

+ +

(rename-window! +win [name])
+

+ +

Renames the window win. name +is a symbol or a string which will also be the window's title.

+ +

Example:

+ +

(rename-window! w 'foo) +

+ +

Will make the title of w to be foo.
+

+ +

(set-background-color! +R G B)
+

+ +

Set the background color of the window. All the +turtles in the window are notified on the new color (used in pen-erase) +

+ +

The colors are defined in terms of Red +Green Blue +(where 0,0,0 is black and 255,255,255 is white).

+ +

Example:

+ +

(set-background-color! +w 255 255 0)

+ +

Will turn the background color of w +to yellow
+

+ +

(clear-window +w)
+

+ +

Clears the screen from all the previous drawings, +leaving only the turtles images on it.

+ +

Example:

+ +

(clear-window w)
+

+ +

(load-bitmap w +"filename" [x y])
+

+ +

Loads the bitmap "filename" +and makes it the background of w. x y are +the coordinates of the upper left corner of the picture. If x +y are not given then the picture is centered.

+ +

Example:

+ +

(load-bitmap w "c:\\windows\\forest.bmp") +
+

+ +

This operation can also be done using the Board +menu.
+
+

+ +

(save-bitmap w +"filename")
+

+ +

Saves the window into a bitmap file called "filename". +

+ +

Example:

+ +

(save-bitmap w "my_draw.bmp") +
+

+ +

This operation can also be done using the Board +menu.
+

+ +

(window-alive? +win)
+

+ +

True if win +is alive, meaning it can get commands.
+

+ +

(window-name w) +

+ +

Returns the name of w. +

+ +

Example:

+ +

(window-name w) +

+ +

Will return "foo" on our window.
+

+ +

TURTLE COMMANDS

+ +

A turtle is an object which is connected to a certain +window. It has inner state variables:
+

+ +

- width: the width +of the pen.

+ +

- heading: the direction +the turtle will go on command forward!. +The heading is in degrees where 0 is upwards and adding to the heading +means clock wise rotation.

+ +

- visibility: if the +body of the turtle is visible on the board or not.

+ +

- solid: if the turtle +is a "solid" turtle (its interior is also drawn) or "hollow" +one (only its circumference is drawn).

+ +

- position: the location +of the turtle on the board, where 0,0 is the upper left corner. +

+ +

- color: the color +of the turtle and it's pen, given in RGB format.

+ +

- pen condition: the +turtle's pen can be in three states:

+ +
    +
  • pen-down : the turtle +will draw as it moves.
  • + +
  • pen-up : the turtle +will not draw as it moves.
  • + +
  • pen-erase : the turtle +will draw in the color of the background as it moves.
  • +
+ +

- pen width: the width +of the pen, the bigger the width the thicker the pen will be.
+

+ +

Turtles can also "see" the board or other +turtles (only from the same board) and can handle user interrupts. A turtle +is always connected to a certain view, which is the view it is drawing +on. Turtles can move between views.
+
+

+ +

(make-turtle win +[name])
+

+ +

Creates and return a new turtle, in window win, +optional name (where name can be anything). +

+ +

The inner state of the new turtle will be: +

+ +
    +
  • position - 400,300
  • + +
  • heading - 0
  • + +
  • color - 0,0,0 (black)
  • + +
  • width - 2
  • + +
  • visible - true
  • + +
  • solid - true
  • +
+ +

Example:

+ +

(define t (make-turtle +'turty))
+

+ +

(turtle-alive? +t)
+

+ +

A predicate that is true if t +is alive, meaning t can get commands. +

+ +

Example:

+ +

(turtle-alive? t)

+ +

Will return true on our t.
+

+ +

(clone-turtle +t [name])
+

+ +

Creates an identical turtle to t +(same inner state).

+ +

Example:

+ +

(define t2 (clone-turtle +t))
+

+ +

(rename-turtle +t [name])
+

+ +

Renames the turtle, name is a string or a symbol +

+ +

Example:

+ +

(rename-turtle t 'pongy) +
+

+ +

(turtle-name t) +
+

+ +

Returns the name of t. +

+ +

Example:

+ +

(turtle-name t) +

+ +

Will return "pongy" on our t.
+

+ +

(forward! t d)
+

+ +

Makes t go +forward (in the heading of t) +d steps. +t will draw while going according to +the state of it's pen.

+ +

Example:

+ +

(forward! t 100) +

+ +

Will cause t +to go forward 100 steps. (In our case since t's +heading hasn't changed it will go upwards)
+

+ +

(turtle-width! +t n)

+ +

Set the width of t's +pen to be n. The bigger n +is the wider the pen will be.
+

+ +

(backwards! t +d)
+

+ +

Same as forward, just in the opposite direction. +

+ +

Example:

+ +

(backwards! t 100) +

+ +

is the same as

+ +

(forward! t -100)
+

+ +

(right! t d)
+

+ +

Will set a new heading to t. +The new heading is the old heading plus d, meaning +t will rotate clock-wise.

+ +

Example:

+ +

(right! t 90) +

+ +

Will make t +turn 90 degrees to the
+

+ +

(left! t d) +

+ +

Same as right, other direction
+

+ +

(set-heading! +t val)
+

+ +

Sets the heading of t +to be val. 0 is upwards and 90 is to +the right.

+ +

Example:

+ +

(set-heading t 180) +

+ +

Will cause t +to point to the bottom of the screen.
+

+ +

(move-to! t x +y)
+

+ +

Makes t move +to point x,y without painting. 0,0 +is the top-left corner of the window.

+ +

Example:

+ +

(move-to! T 100 100) +

+ +

Will cause t +to move to point 100,100.
+

+ +

(draw-to! t x +y)
+

+ +

Moves t to +x,y possibly drawing or erasing according +to the state of t's pen.

+ +

Example:

+ +

(draw-to! t 0 0)
+

+ +

(move-turtle-to-window +t win)

+ +

Move t to the +window win

+ +

Example:

+ +

(move-turtle-to-window +t w)
+

+ +

(pen-up! t)
+

+ +

The pen of t +is up, so he won't paint when moving.

+ +

Example:

+ +

(pen-up! t)
+

+ +

(pen-down! t)
+

+ +

Causes t's +pen to be down, meaning he will draw as he is moving.
+

+ +

(pen-erase! t)
+

+ +

Causes t's +pen to be in the same color as the background color of the window it is +attached to.
+

+ +

(show-turtle! +t)
+

+ +

Makes t visible. +Meaning he will be seen on the board.

+ +

Example:

+ +

(show-turtle! t)
+

+ +

(hide-turtle! +t)
+

+ +

Makes t invisible. +Meaning he will not be seen on the board. (but all the drawing he does +will be seen)

+ +

Example:

+ +

(hide-turtle! t)
+

+ +

(make-turtle-solid! +t)
+

+ +

Makes t a solid +turtle.
+

+ +

(make-turtle-hollow! +t)
+

+ +

Make t a "hollow" +turtle.
+

+ +

(kill-turtle! +t)
+

+ +

Kills t. Meaning +it will be erased from the board and will not accept further commands. +

+ +

Note: This is the only way to get rid of a turtle. +

+ +

Example:

+ +

(kill-turtle! t) +

+ +

Will cause when writing t +in the command line to the response

+ +

#<dead turtle>
+

+ +

(set-color! t +R G B) or (set-color! t (list R G B)
+

+ +

Sets t's color +(and it's pen), in RGB format.

+ +

Example:

+ +

(set-color! t 255 0 255) +

+ +

Will cause t +to be pinkish.

+ +

Same as:

+ +

(define pinkish '(255 +0 255))

+ +

(set-color! t pinkish)
+

+ +

(turtle-inner-state +t)
+

+ +

Returns a list of 6 parameters: color, heading, +hidden-flag, pen width, solid flag, location (cons x y))

+ +

Example:

+ +

(define new-t (make-turtle +w))

+ +

(turtle-inner-state new-t) +

+ +

Will return the list

+ +

((0 0 0) 0.0 #f 2 #t (400.0 +. 300.0))
+

+ +

Below are functions that returns only one of the +parameters returned by turtle-inner-state: +
+

+ +

(turtle-color t) +

+ +

(turtle-heading t) +

+ +

(turtle-visible t) +

+ +

(turtle-width t) +

+ +

(turtle-solid? t) +

+ +

(turtle-position t)
+

+ +

TURTLE VISION
+

+ +

A turtle can interact with the board. It can "see" +colors or other turtles.
+
+

+ +

(look t distance +angle '(R G B))
+

+ +

Will return true if there is a point in color (R +G B) in distance distance from +t and in the area bordered by the angle +2*angle.

+ +

Example:

+ +

(look t 50 20 '(0 0 0)) +

+ +

Will cause t +to search for the color black (RGB 0,0,0) in the area shown here in blue:
+

+ +


+

+ +

(look t distance +angle [t1])
+

+ +

Same as if looking for color, just this time it +will be true is t1 is in the visible area.

+ +

If no target turtle is defined then the function +will return true if any turtle from this window is in the visible area. +

+ +

Example:

+ +

(define new-t (clone-turtle +t))

+ +

(forward! new-t 30) +

+ +

(look t 50 20 new-t) +

+ +

And

+ +

(look t 50 20) +

+ +

Will both return true.
+
+

+ +

INTERRUPTS (NOTIFICATIONS) +
+

+ +

A turtle can hold a list of interrupts (or notifications). +When an interrupt is invoked it send a given message to the thread that +sent the command. Every interrupt is defined by a "look" arguments. +An interruptcan be of three kinds:
+

+ +

A "yes" interrupt - The interrupt will +happen (message sent) on every "first" time the look returns +yes.

+ +

Meaning if a turtle is told to invoke an interrupt +every time it sees blue on a certain region. Then the first time it sees +blue it will invoke the interrupt. From now on if the blue is in view it +will not invoke the interrupt. Then if it loses sight of the blue object, +the next time it sees blue again it will invoke the interrupt, and so on.
+

+ +

A "no" interrupt - Same as the "yes" +interrupt, just this time the interrupt is invoked when the sought object +is not seen.
+

+ +

A "both" interrupt - First time the sought +object is viewed the "yes" message is sent, then the first time +the turtle loses sight of the object the "no" message is sent +and so on.

+ +

A message can be any SCHEME object.
+

+ +

When the interpreter is installing interrupt to +a turtle it need to install a handler, which is a function that +takes only one argument and this argument is the messages that comes from +the interrupt.

+ +

If no handler is installed, the messages will be +sent but will have no affect on the thread of execution.

+ +

There can be only one handler per thread and a +handler can not be a primitive procedure.
+

+ +

(turtle-notify +t msg1 msg2 distance angle TARGET)

+ +

Instructs a turtle to send msg1 and msg2 upon seeing +and not seeing, respectively, the target. The messages can be any Scheme +objects, which are sent to the thread as if by (tell-thread). The other +parameters - see (look)

+ +

Example:

+ +

(turtle-notify t 'yes +'no 50 10 new-t)

+ +

This is a "both" kind interrupt.
+

+ +

(turtle-no-notify +t distance angle TARGET)
+

+ +

Tells the turtle to stop notifying in the given +case. Very like deleting the interrupt from the turtle.
+

+ +

(notify-when[-not] +t1 msg dist ang TARGET)
+

+ +

Instructs a turtle to send msg upon [stopping] +seeing the target. This is a "yes" or "no" interrupt. +

+ +

Example:

+ +

(notify-when t 'gotcha +50 10 new-t)

+ +

Will cause t +to send the message "gotcha" every "first" time it +sees new-t.
+

+ +

(stop-notifying +t)
+

+ +

t will temporarily +stop notifying on interrupts. Like "clear interrupts".
+

+ +

(continue-notifying +t)
+

+ +

t will resume +notifying on interrupts.
+

+ +

(no-notifications +t)

+ +

Deletes all t's +interrupts.
+

+ +

(notify-on-click +turtle msg)
+

+ +

Instructs turtle to send msg when right-clicked +with the mouse (distance of 5 pixels from the turtle location). There can +be only one interrupt of this kind per turtle.

+ +

Example:

+ +

(notify-on-click t 'ouch) +

+ +

Will case t +to send the message "ouch" when the user right-clicks next to +it.
+

+ +

(notify-on-click +window msg)
+

+ +

Instructs window to +send msg when right-clicked with the +mouse not close to any turtle.
+

+ +

(clear-notify-click +t)
+

+ +

Clears the user right click interrupt
+

+ +

(install-handler +func)
+

+ +

Installs a message handler. When a message arrives, +func is called with it as a sole argument. +

+ +

There can be only one handler per thread. func +can not be a primitive procedure.

+ +

Example:

+ +

(define (print x) (write +x))

+ +

(notify-on-click t 'click-on-t) +

+ +

(install-handler print) +

+ +

Will cause that the message "click-on-t" +will be printed each time the user right clicked on t. +
+

+ +

THREADS
+

+ +

Galapagos supports multiple threads. Every thread +is a complete Scheme interpreter, with its own base environment. Every +thread has a Thread Object, which uniquely identifies it.
+

+ +

A console is a text window where the user +can type commands (when the interpreter is idle) and see output. A thread +may or may not be bound to a console. Information printed by a non-bound +thread is lost; a non-bound thread waiting for input is stuck (unless provisions +were made to allow a new console to be created by means of inter-thread +communications.) If a non-bound thread has nothing to do, instead of waiting +for input like a bound thread, it will terminate.
+

+ +

(this-thread)
+

+ +

Returns the thread-object of the current thread. +

+ +

Example:

+ +

(this-thread) +

+ +

Will return something like

+ +

#<thread 0x6d1e2c> +
+

+ +

(is-first-thread?) +
+

+ +

True if the current thread is the first SCM thread.
+

+ +

(thread? t) +

+ +

True if t is a thread

+ +

Example:

+ +

(thread? (this-thread)) +

+ +

Will return true
+

+ +

(active-threads) +
+

+ +

Returns the number of active threads
+

+ +

(new-thread form+) +

+ +

Creates a new thread that will calculate the form[s] +

+ +

Example:

+ +

(new-thread (define t +(make-turtle w)) (forward! t 200))

+ +

Will make a new thread that will create a new turtle +and will move it forward 200 steps and then terminates.

+ +

(new-thread (bind-to-console)) +

+ +

Will make a new thread that's ready to accept commands +form a newly-created window. The same can be achieved by selecting "Fork" +from "Scheme" menu.
+
+
+

+ +

(break& form+) +
+

+ +

Causes the current thread to stop and calculate +the form[s]. The current computation is lost.
+

+ +

(bind-to-console) +
+

+ +

The thread will get its commands from a console. +

+ +

Example:

+ +

(new-thread (bind-to-console)) +

+ +

Will create a new thread that gets it.
+

+ +

(unbind-console) +

+ +

Close bound console.
+

+ +

(rename-console +name)

+ +

New name for the current console
+

+ +

(install-handler +func)
+

+ +

Installs a message handler. When a message arrives, +func is called with it as a sole argument. +

+ +

There can be only one handler per thread. func +can not be a primitive procedure.

+ +

Example:

+ +

(define (print x) (write +x))

+ +

(notify-on-click t 'click-on-t) +

+ +

(install-handler print) +

+ +

Will cause that the message "click-on-t" +will be printed each time the user right clicked on t. +

+ +

Note: (new -thread (install-handler +f)) is a bad idea, because the fresh thread will terminate immediately. +
+

+ +

(tell-thread th +x)
+

+ +

Sends message X +to thread th. Returns true on success. +

+ +

If th has no +handler installed it will cause nothing.
+

+ +

(quit-thread)
+

+ +

Kills the current thread, does not work on the +main thread.
+

+ +

(quit-program)
+

+ +

Quits the program.
+
+
+

+ +

These are primitives taken from SCM, which were +modifies to be multithread-safe: + +

+ + +

+An arbiter +is a data object the canbe used as a +guard for critical sections. It can be either "locked" or "unlocked". It +is ideal when a busy/wait mechanism is required, since it is MT-safe. +

+ + +

(sleep n) +

+ +

Causes the current thread to block for (approximately) +n seconds. (sleep 0) is a way to instruct +a thread to give up its remaining processor time.
+

+ + +

(make-arbiter +name)
+

+ +

Makes an arbiter called name. +

+ +

Example:

+ +

(define x-arb (make-arbiter +'x-guard))
+
+

+ +

(try-arbiter arb) +
+

+ +

Checks if the arbiter arb +is up. If the arbiter is up returns false, otherwise it sets +the arbiter to be "up" and returns true.

+ +

Example:

+ +

(try-arbiter x-arb) +

+ +

Will return true and set x-arb +to be "up". But trying it for the second time return false since +x-arb is "up".
+

+ +

(release-arbiter +arb)
+

+ +

Set the arb +to be "down". If the arbiter was "up" returns true +otherwise returns false.

+ +

Example:

+ +

(release-arbiter x-arb) +

+ +

Will return true , but using this function again +will return false since x-arb is already +down.

+ + +

+


+
+ [TOP] + [PREV] + [PREV] + [PREV] +
+ + + + + diff --git a/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20010921035619/~elad/GALAPAGOS/index.html b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20010921035619/~elad/GALAPAGOS/index.html new file mode 100644 index 0000000..56faa74 --- /dev/null +++ b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20010921035619/~elad/GALAPAGOS/index.html @@ -0,0 +1,95 @@ + + + + Galapagos + + + +

Welcome to
+GALAPAGOS

+ +Galapagos is an interactive multithreaded Scheme interpreter with turtle +graphics for Windows 95. It is built around the SCM interpreter, and it +provides multiple interpreters, threads, turtles, and drawing boards, all +running concurrently using WIN32's multithreading abilities, and freely +available. + +

+


+

+

+

+Spring 1997

+Graduation project

+Department of Math & Computer Science,

+Ben-Gurion University of the Negev

+
+Written by Elad Eyal and Miki +Tebeka.
+
+Supervisor: Dr. Michael Elhadad +
+

+

+


+

+ +

TABLE OF CONTENTS

+ + + +

+ +
+ +

DOWNLOAD CENTER

+

+

GNU LICENSE. COPYRIGHTED. PROVIDED "AS IS". NO +WARRANTIES OR LIABILITIES. ETC.
+

+

+500K gps10bin.zip - Executable and required Scheme libraries (SLIB)
+700K gps10src.zip - Same with all source code
+400K mfc40dll.zip - You might need this MFC40.DLL if you +don't have it already.
+ + diff --git a/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20220312053305/~elad/GALAPAGOS/index.html b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20220312053305/~elad/GALAPAGOS/index.html new file mode 100644 index 0000000..56faa74 --- /dev/null +++ b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20220312053305/~elad/GALAPAGOS/index.html @@ -0,0 +1,95 @@ + + + + Galapagos + + + +

Welcome to
+GALAPAGOS

+ +Galapagos is an interactive multithreaded Scheme interpreter with turtle +graphics for Windows 95. It is built around the SCM interpreter, and it +provides multiple interpreters, threads, turtles, and drawing boards, all +running concurrently using WIN32's multithreading abilities, and freely +available. + +

+


+

+

+

+Spring 1997

+Graduation project

+Department of Math & Computer Science,

+Ben-Gurion University of the Negev

+
+Written by Elad Eyal and Miki +Tebeka.
+
+Supervisor: Dr. Michael Elhadad +
+

+

+


+

+ +

TABLE OF CONTENTS

+ + + +

+ +
+ +

DOWNLOAD CENTER

+

+

GNU LICENSE. COPYRIGHTED. PROVIDED "AS IS". NO +WARRANTIES OR LIABILITIES. ETC.
+

+

+500K gps10bin.zip - Executable and required Scheme libraries (SLIB)
+700K gps10src.zip - Same with all source code
+400K mfc40dll.zip - You might need this MFC40.DLL if you +don't have it already.
+ + diff --git a/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20220312053307/~elad/GALAPAGOS/index.html b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20220312053307/~elad/GALAPAGOS/index.html new file mode 100644 index 0000000..56faa74 --- /dev/null +++ b/websites/www.cs.bgu.ac.il/~elad/GALAPAGOS/20220312053307/~elad/GALAPAGOS/index.html @@ -0,0 +1,95 @@ + + + + Galapagos + + + +

Welcome to
+GALAPAGOS

+ +Galapagos is an interactive multithreaded Scheme interpreter with turtle +graphics for Windows 95. It is built around the SCM interpreter, and it +provides multiple interpreters, threads, turtles, and drawing boards, all +running concurrently using WIN32's multithreading abilities, and freely +available. + +

+


+

+

+

+Spring 1997

+Graduation project

+Department of Math & Computer Science,

+Ben-Gurion University of the Negev

+
+Written by Elad Eyal and Miki +Tebeka.
+
+Supervisor: Dr. Michael Elhadad +
+

+

+


+

+ +

TABLE OF CONTENTS

+ + + +

+ +
+ +

DOWNLOAD CENTER

+

+

GNU LICENSE. COPYRIGHTED. PROVIDED "AS IS". NO +WARRANTIES OR LIABILITIES. ETC.
+

+

+500K gps10bin.zip - Executable and required Scheme libraries (SLIB)
+700K gps10src.zip - Same with all source code
+400K mfc40dll.zip - You might need this MFC40.DLL if you +don't have it already.
+ +