Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
####### # # E-scripts on Squeak (not on other SmallTalks) # # Note 1: use the eev command (defined in eev.el) and the # ee alias (in my .zshrc) to execute parts of this file. # Executing this file as a whole makes no sense. # An introduction to eev can be found here: # # (find-eev-quick-intro) # http://angg.twu.net/eev-intros/find-eev-quick-intro.html # # Note 2: be VERY careful and make sure you understand what # you're doing. # # Note 3: If you use a shell other than zsh things like |& # and the for loops may not work. # # Note 4: I always run as root. # # Note 5: some parts are too old and don't work anymore. Some # never worked. # # Note 6: the definitions for the find-xxxfile commands are on my # .emacs. # # Note 7: if you see a strange command check my .zshrc -- it may # be defined there as a function or an alias. # # Note 8: the sections without dates are always older than the # sections with dates. # # This file is at <http://angg.twu.net/e/squeak.e> # or at <http://angg.twu.net/e/squeak.e.html>. # See also <http://angg.twu.net/emacs.html>, # <http://angg.twu.net/.emacs[.html]>, # <http://angg.twu.net/.zshrc[.html]>, # <http://angg.twu.net/escripts.html>, # and <http://angg.twu.net/>. # ####### (global-set-key (kbd "C-v") 'yank) (global-unset-key (kbd "C-v")) # «.mailing-lists» (to "mailing-lists") # «.irc» (to "irc") # «.tutorials» (to "tutorials") # «.squeak-by-example» (to "squeak-by-example") # «.squeak-shout» (to "squeak-shout") # «.openInWorld» (to "openInWorld") # «.addAlarm:» (to "addAlarm:") # «.SimpleSwitchMorph» (to "SimpleSwitchMorph") # «.SimpleButtonMorph» (to "SimpleButtonMorph") # «.Matrix» (to "Matrix") # «.quinto» (to "quinto") # «.books» (to "books") # «.Point3D» (to "Point3D") # «.OSProcess» (to "OSProcess") # «.See» (to "See") # «.See.st.html» (to "See.st.html") # «.CompiledMethod» (to "CompiledMethod") # «.fileOut-format» (to "fileOut-format") # «.menuitem-action» (to "menuitem-action") # «.openSelectorBrowser» (to "openSelectorBrowser") # «.ToolBuilder» (to "ToolBuilder") # «.squeaksource» (to "squeaksource") # «.changes-and-screenshots» (to "changes-and-screenshots") # «.commandKeyHelp» (to "commandKeyHelp") # «.CommandShell» (to "CommandShell") # «.squeak-3.6» (to "squeak-3.6") # «.learn-squeak» (to "learn-squeak") # «.squeak-sarge» (to "squeak-sarge") # «.squeak-vm» (to "squeak-vm") # «.squeak-debian-2006» (to "squeak-debian-2006") # «.squeak-on-etch» (to "squeak-on-etch") # «.squeak-binfmts» (to "squeak-binfmts") # «.install-2023» (to "install-2023") # «.install-2022» (to "install-2022") # «.smalltalkeditor-feb2022» (to "smalltalkeditor-feb2022") # «.tweaks.cs» (to "tweaks.cs") # «.autocompletion» (to "autocompletion") # «.Tools-menu» (to "Tools-menu") # «.Workspace» (to "Workspace") # «.openWorkspace» (to "openWorkspace") # «.workspaces-compiler» (to "workspaces-compiler") # «.HelpBrowserB» (to "HelpBrowserB") # «.morphic-events» (to "morphic-events") # «.IconicButton» (to "IconicButton") # «.EdrxMorph» (to "EdrxMorph") # «.KeyboardExerciser» (to "KeyboardExerciser") # «.Bricks» (to "Bricks") # «.Kedama» (to "Kedama") # «.game-prog-with-etoys» (to "game-prog-with-etoys") # «.PolygonMorph» (to "PolygonMorph") # «.PolygonMorph-EventHandler» (to "PolygonMorph-EventHandler") # «.PolygonMorph-EventHandler-2» (to "PolygonMorph-EventHandler-2") # «.PolygonMorph-EventHandler-3» (to "PolygonMorph-EventHandler-3") # «.synthetic-kb-event» (to "synthetic-kb-event") # «.EToys-kfr» (to "EToys-kfr") # «.activeGlobals» (to "activeGlobals") # «.currentWorld» (to "currentWorld") # «.morphic-tutorial-1» (to "morphic-tutorial-1") # «.debugger» (to "debugger") # «.generateKeyboardEvent» (to "generateKeyboardEvent") # «.handlesKeyboard» (to "handlesKeyboard") # «.respondsTo» (to "respondsTo") # «.globals» (to "globals") # «.world-morphs» (to "world-morphs") # «.question-about-a» (to "question-about-a") # «.ATheWorldMainDockingBar» (to "ATheWorldMainDockingBar") # «.20220302-transpose» (to "20220302-transpose") # «.etoys-qg» (to "etoys-qg") # «.etoys» (to "etoys") # «.etoys-blob-car» (to "etoys-blob-car") # «.EventRecorder» (to "EventRecorder") # «.LineMorph» (to "LineMorph") # «.HorizontalNumberLineMorph» (to "HorizontalNumberLineMorph") # «.Slider» (to "Slider") # «.See-store» (to "See-store") # «.search-bar» (to "search-bar") # «.resetHandlerFields» (to "resetHandlerFields") # «.Delay» (to "Delay") # «.TerseGuideHelp» (to "TerseGuideHelp") # «.See-terseGuide» (to "See-terseGuide") # «.BubbleFilters» (to "BubbleFilters") # «.save-keystroke-events» (to "save-keystroke-events") # «.non-openInWorld-able» (to "non-openInWorld-able") # «.TestLayoutMorph» (to "TestLayoutMorph") # «.LayoutPolicy» (to "LayoutPolicy") # «.EncoderForV3» (to "EncoderForV3") # «.TheWorldMenu-newMorph» (to "TheWorldMenu-newMorph") # «.browseFullProtocol» (to "browseFullProtocol") # «.Interval» (to "Interval") # «.Context» (to "Context") # «.roguerrants» (to "roguerrants") # «.DisplayScreen» (to "DisplayScreen") # «.LambdaMessageSend» (to "LambdaMessageSend") # «.launchPartVia» (to "launchPartVia") # «.Mines» (to "Mines") # «.EventRecorder» (to "EventRecorder") # «.PasteUpMorph» (to "PasteUpMorph") # «.repl» (to "repl") # (find-es "smalltalk") http://minnow.cc.gatech.edu/squeak/uploads/SqueakLanguageRef.3.html http://minnow.cc.gatech.edu/squeak/uploads/SqueakClassesRef.html ##### # # mailing-lists # 2023jan26 # ##### # «mailing-lists» (to ".mailing-lists") # http://wiki.squeak.org/squeak/608 Squeak Mailing Lists # http://wiki.squeak.org/squeak/775 FAQ: Mailing List Archives # http://lists.squeakfoundation.org/mailman/listinfo/beginners # http://lists.squeakfoundation.org/pipermail/beginners/ (archive) # http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/squeak-dev # http://lists.squeakfoundation.org/pipermail/squeak-dev/ (archive) # http://lists.squeakfoundation.org/pipermail/beginners/2023-January/010308.html 3D? # http://lists.squeakfoundation.org/pipermail/beginners/2023-January/010309.html RET ##### # # irc # 2023jan27 # ##### # «irc» (to ".irc") # (find-es "rcirc" "oftc") # http://wiki.squeak.org/squeak/1915 Squeak on IRC # http://wiki.squeak.org/squeak/5888 IRC Portal (defun sq2 () (interactive) (find-libera-2a "#squeak")) (defun sq3 () (interactive) (find-libera-3a "#squeak")) ##### # # tutorials # 2022mar02 # ##### # «tutorials» (to ".tutorials") # http://wiki.squeak.org/squeak/792 Squeak Tutorials # http://wiki.squeak.org/squeak/6622 Learning Squeak in 2020 *** # http://wiki.squeak.org/squeak/792#eToys # http://wiki.squeak.org/squeak/792#Morphic # http://wiki.squeak.org/squeak/792#Seaside # http://en.scratch-wiki.info/wiki/Squeak_Tutorial # http://wiki.squeak.org/squeak/3501 Discovering Better Code: Bowling for Smalltalk Series # http://wiki.squeak.org/squeak/795 Morphic Tutorial: Build a 4 digit LED counter # http://wiki.squeak.org/squeak/1827 Counter Tutorial: A Morphic Fascination *** # http://www.jvuletich.org/Squeak/IntroductionToMorphic/Morphic.html # http://www.jvuletich.org/Squeak/IntroductionToMorphic/Morphic-Playing.html # http://wiki.squeak.org/squeak/1175 Fabrik ##### # # Squeak by Example # 2023jan22 # ##### # «squeak-by-example» (to ".squeak-by-example") # (find-books "__comp/__comp.el" "squeak-by-example") # (find-es "pharo" "pharo-by-example") # http://github.com/hpi-swa-lab/SqueakByExample-english/releases/download/5.3.1/SBE-5.3.pdf * (eepitch-shell) * (eepitch-kill) * (eepitch-shell) cp -v $S/http/github.com/hpi-swa-lab/SqueakByExample-english/releases/download/5.3.1/SBE-5.3.pdf \ ~/SQUEAK/squeak-by-example-5.3.pdf cd ~/SQUEAK/ scp squeak-by-example-5.3.pdf $LINS/SQUEAK/ scp squeak-by-example-5.3.pdf $LINP/SQUEAK/ * (eepitch-linode) * (eepitch-kill) * (eepitch-linode) mkdir -p ~/public_html/SQUEAK/ mkdir -p ~/slow_html/SQUEAK/ # (find-linodepfile "SQUEAK/") # (find-linodesfile "SQUEAK/") # Old: # http://open.umn.edu/opentextbooks/textbooks/313 # http://pdxscholar.library.pdx.edu/compsci_fac/110/ # http://pdxscholar.library.pdx.edu/cgi/viewcontent.cgi?article=1112&context=compsci_fac PDF # http://pdxscholar.library.pdx.edu/Squeak_by_Example.pdf (fake URL) # http://github.com/SquareBracketAssociates/SqueakByExample-english # (find-squeakbyexpage (+ 14 9) "new morph" "alphabetical list") # (find-squeakbyextext (+ 14 9) "new morph" "alphabetical list") world -> old desktop menu (W) -> new morph -> from alphabetical list ##### # # Squeak by Example: testShout and shout # 2023jan25 # ##### # «squeak-shout» (to ".squeak-shout") # (find-squeakbyexpage (+ 14 22) "Method 1.1: A test for a shout method") # (find-squeakbyextext (+ 14 22) "Method 1.1: A test for a shout method") # (find-squeakbyexpage (+ 14 25) "Method 1.2: The shout method") # (find-squeakbyextext (+ 14 25) "Method 1.2: The shout method") String String browse 'converting -> shout' StringTest browse 'tests - converting -> testShout' testShout self assert: ('Don''t panic' shout = 'DON''T PANIC!') shout ^ self asUppercase, '!' ##### # # openInWorld # 2023feb21 # ##### # «openInWorld» (to ".openInWorld") # (find-squeakbyexpage (+ 16 33) "self openInWorld") # (find-squeakbyextext (+ 16 33) "self openInWorld") See cm: (Morph >> #openInWorld). See cm: (Morph >> #openInWorld:). ##### # # addAlarm: # 2023feb21 # ##### # «addAlarm:» (to ".addAlarm:") # (find-TH "eev-squeak" "addAlarm") # (find-squeakfile "See.st") # (find-squeakfile "See.st" "run: aBlock after: ms") # How do I "sleep 5"? # http://lists.squeakfoundation.org/pipermail/squeak-dev/2023-February/223483.html Edrx 1 # http://lists.squeakfoundation.org/pipermail/squeak-dev/2023-February/223484.html Vanessa 2 # http://lists.squeakfoundation.org/pipermail/squeak-dev/2023-February/223486.html Edrx 3 # http://lists.squeakfoundation.org/pipermail/squeak-dev/2023-February/223487.html Karl 4 # http://lists.squeakfoundation.org/pipermail/squeak-dev/2023-February/223488.html Edrx 5 # http://lists.squeakfoundation.org/pipermail/squeak-dev/2023-February/223490.html Marcel 6 # http://lists.squeakfoundation.org/pipermail/squeak-dev/2023-February/223502.html Karl 7 # http://lists.squeakfoundation.org/pipermail/squeak-dev/2023-February/223518.html STPope 8 See cm: (Morph >> #addAlarm:after:). See cm: (Morph >> #addAlarm:withArguments:after:). See cm: (Morph >> #addAlarm:with:after:). See cm: (Morph >> #addAlarm:with:with:after:). "Create a SimpleSwitchMorph with label 'Toggle' and a SimpleButtonMorph with label 'Flash'. The button will be placed below the switch." sm := SimpleSwitchMorph new. sm openInWorld. bm := SimpleButtonMorph new. bm openInWorld. bm position: bm position + (0@32). "Three ways of toggling the color of the switch:" sm toggleState. bl := [ sm toggleState ]. bl value. bm target: bl. bm actionSelector: #value. bm doButtonAction. "Two ways of toggling the switch after 1000ms:" sm addAlarm: #toggleState after: 1000. bm addAlarm: #doButtonAction after: 1000. "Save the keyboard focus in kf after 5s:" kf := 0. bl := [ sm toggleState ]. bl := [ kf := self currentHand keyboardFocus ]. bm target: bl. bm actionSelector: #value. bm addAlarm: #doButtonAction after: 5000. kf. and now I can simply run this See run: [ kf := self currentHand keyboardFocus ] after: 5000. to save into the variable kf the morph on which the keyboard focus is after 5 second. Neat! =) Cheers, Eduardo Ochs http://anggtwu.net/eev-squeak.html ##### # # resetHandlerFields # 2023feb20 # ##### # «resetHandlerFields» (to ".resetHandlerFields") # (find-squeaksharedfile "") # (find-squeaksharedfile "See class-accessing.st") See cm: (HandMorphForReplay >> #processEvents). See cm: (MorphicEvent >> #resetHandlerFields). See cm: (UserInputEvent >> #resetHandlerFields). See cm: (DropEvent >> #resetHandlerFields). See store: Dictionary new. ar := Array with: 50@100 with: 200@300 with: 100@400. pm := (PolygonMorph vertices: ar color: Color red borderWidth: 1 borderColor: Color black). eh := EventHandler new. bl := [ :evt :sm | self halt. Transcript show: { evt . sm }; cr. ]. pm eventHandler: eh. eh on: #keyStroke send: #value:value: to: bl. World addMorph: pm. See keyboardFocus: pm. "Run this in PolygonMorph -> debugger:" See at: #CR put: evt. "Go back to the workspace, and then do:" evt := See at: #CR. evt. evt wasHandled. evt resetHandlerFields. evt wasHandled. pm handleEvent: evt. sendFilterEventBubble: anEvent for: self. See cm: (TextMorphForEditView >> keyStroke:). evt keyCharacter: Character cr. TextEditor>>#accept kf explore. kf editor. kf editor accept. ##### # # SimpleSwitchMorph # 2023feb21 # ##### # «SimpleSwitchMorph» (to ".SimpleSwitchMorph") # (find-books "__comp/__comp.el" "squeak-by-example" "The Quinto game") # (find-squeakbyexpage (+ 16 29) "SimpleSwitchMorph") # (find-squeakbyextext (+ 16 29) "SimpleSwitchMorph") See class: SimpleSwitchMorph See cm: (SimpleSwitchMorph >> #initializeWithLabel:). sm := SimpleSwitchMorph new. sm openInWorld. sm initialize. sm label: ''; borderWidth: 2; bounds: (0 @ 0 corner: 16 @ 16); offColor: Color cantaloupe; onColor: Color aqua; useSquareCorners. sm turnOff. sm turnOn. sm := SimpleSwitchMorph new. sm openInWorld. sm label: 'A'. sm toggleState. sm addAlarm: #toggleState after: 1000. bl := [ :evt :sm | Transcript show: { evt . sm }; cr. ]. eh := EventHandler new. eh on: #keyStroke send: #value:value: to: bl. ##### # # SimpleButtonMorph # 2023feb21 # ##### # «SimpleButtonMorph» (to ".SimpleButtonMorph") See class: SimpleButtonMorph See cm: (SimpleButtonMorph >> #label:). See cm: (SimpleButtonMorph >> #browseImplementationOfActionSelector). See cm: (SimpleButtonMorph >> #target:). See cm: (SimpleButtonMorph >> #doButtonAction). bm := SimpleButtonMorph new. bm openInWorld. bm label: 'Foo'. bm doButtonAction. rm := RectangleMorph new. rm openInWorld. rm color: Color red. bm position: bm position + (0@16). sm := SimpleSwitchMorph new. sm openInWorld. sm addAlarm: #toggleState after: 1000. bm := SimpleButtonMorph new. bm openInWorld. bm position: bm position + (0@32). bm label: 'Foo'. bm doButtonAction. Hi Vanessa! Thanks! =) This works in a workspace, "Create a SimpleSwitchMorph with label 'Toggle' and a SimpleButtonMorph with label 'Flash'. The button will be placed below the switch." sm := SimpleSwitchMorph new. sm openInWorld. bm := SimpleButtonMorph new. bm openInWorld. bm position: bm position + (0@32). "Three ways of toggling the color of the switch:" sm toggleState. bl := [ sm toggleState ]. bl value. bm target: bl. bm actionSelector: #value. bm doButtonAction. "Two ways of toggling the switch after 1000ms:" sm addAlarm: #toggleState after: 1000. bm addAlarm: #doButtonAction after: 1000. but this doesn't: bm2 := SimpleButtonMorph new. bm2 target: bl. bm2 actionSelector: #value. bm2 addAlarm: #doButtonAction after: 1000. What is the right way to add an alarm to a morph that is not shown on the screen? Also, can I create a new invisible morph every time that I want to run an alarm? Are they going to be garbage collected? Thanks in advance! Eduardo Ochs http://anggtwu.net/eev-squeak.html Hi Vanessa! http://www.youtube.com/watch?v=BNjgltkqTzc sm addAlarm: #toggleState after: 1000. self halt. bm doButtonAction. bm explore. bm class browse. bl := [ sm toggleState ]. bl value. bm target: bl. bm actionSelector: #value. sm addAlarm: #toggleState after: 1000. bm addAlarm: #doButtonAction after: 1000. ##### # # Matrix # 2023feb25 # ##### # «Matrix» (to ".Matrix") See cm: (SequenceableCollectionTest >> #testPreMultiplyByMatrix). See cm: (Matrix >> #preMultiplyByMatrix:). See class: Matrix. ##### # # quinto # 2023jan25 # ##### # «quinto» (to ".quinto") # (find-squeakbyexpage (+ 14 33) "Method 2.2: Initializing instances of SBECell") # (find-squeakbyextext (+ 14 33) "Method 2.2: Initializing instances of SBECell") initialize super initialize. self label: ''. self borderWidth: 2. bounds := 0@0 corner: 16@16. offColor := Color paleYellow. onColor := Color paleBlue darker. self useSquareCorners. self turnOff # (find-squeakbyexpage (+ 14 36) "Method 2.4: Initializing the game") # (find-squeakbyextext (+ 14 36) "Method 2.4: Initializing the game") initialize | sampleCell width height n | super initialize. n := self cellsPerSide. sampleCell := SBECell new. width := sampleCell width. height := sampleCell height. self bounds: (5@5 extent: ((width*n) @(height*n)) + (2 * self borderWidth)). cells := Matrix new: n tabulate: [ :i :j | self newCellAt: i at: j ]. # (find-squeakbyexpage (+ 14 40) "Method 2.5: A constant method") # (find-squeakbyextext (+ 14 40) "Method 2.5: A constant method") cellsPerSide "The number of cells along each side of the game" ^ 10 # (find-squeakbyexpage (+ 14 40) "Method 2.6: An initialization helper method") # (find-squeakbyextext (+ 14 40) "Method 2.6: An initialization helper method") newCellAt: i at: j "Create a cell for position (i,j) and add it to my on--screen representation at the appropriate screen position. Answer the new cell" | c origin | c := SBECell new. origin := self innerBounds origin. self addMorph: c. c position: ((i - 1) * c width) @ ((j - 1) * c height) + origin. c mouseAction: [self toggleNeighboursOfCellAt: i at: j]. # (find-squeakbyexpage (+ 14 41) "Method 2.7: The callback method") # (find-squeakbyextext (+ 14 41) "Method 2.7: The callback method") toggleNeighboursOfCellAt: i at: j (i > 1) ifTrue: [ (cells at: i - 1 at: j ) toggleState]. (i < self cellsPerSide) ifTrue: [ (cells at: i + 1 at: j) toggleState]. (j > 1) ifTrue: [ (cells at: i at: j - 1) toggleState]. (j < self cellsPerSide) ifTrue: [ (cells at: i at: j + 1) toggleState]. # (find-squeakbyexpage (+ 14 41) "Method 2.8: A typical setter method") # (find-squeakbyextext (+ 14 41) "Method 2.8: A typical setter method") SBECell»mouseAction: aBlock ^ mouseAction := aBlock # (find-squeakbyexpage (+ 14 42) "Method 2.9: An event handler") # (find-squeakbyextext (+ 14 42) "Method 2.9: An event handler") SBECell»mouseUp: anEvent mouseAction value String String browse StringTest browse SBECell new SBECell new openInWorld SBEGame new openInWorld # (find-fline "~/SQUEAK/Squeak5.3-19459-64bit-202003021730-Linux/shared/SBE-Quinto.st") ##### # # books # 2023feb20 # ##### # «books» (to ".books") # (find-books "__comp/__comp.el" "smalltalk") # http://wiki.squeak.org/squeak/689 Smalltalk & Squeak books # http://wiki.squeak.org/squeak/471 Squeak FAQ # http://stephane.ducasse.free.fr/FreeBooks.html # http://rmod-files.lille.inria.fr/FreeBooks/BlueBookHughes/Design%20Principles%20Behind%20Smalltalk.pdf # http://rmod-files.lille.inria.fr/FreeBooks/SmalltalkHistoryHOPL.pdf http://rmod-files.lille.inria.fr/FreeBooks/ByExample/CodeExamples.zip http://rmod-files.lille.inria.fr/FreeBooks/ByExample/25%20-%20Chapter%2023%20-%20Model-View-Controller.pdf http://rmod-files.lille.inria.fr/FreeBooks/ByExample/SmalltalkByExampleON2.pdf http://rmod-files.lille.inria.fr/FreeBooks/ByExample/SmalltalkByExampleNewRelease.pdf http://rmod-files.lille.inria.fr/FreeBooks/InsideST/InsideSmalltalk.pdf http://rmod-files.lille.inria.fr/FreeBooks/InsideST/InsideSmalltalkII.pdf http://rmod-files.lille.inria.fr/FreeBooks/PracticalSmalltalk/PracticalSmalltalk.pdf http://rmod-files.lille.inria.fr/FreeBooks/HopkinsHoran/HopkinsHoran.pdf ;; (find-stbyexpage) ;; (find-stbyextext) ##### # # Point3D # 2023jan27 # ##### # «Point3D» (to ".Point3D") # (find-fline "~/SQUEAK/Squeak5.3-19459-64bit-202003021730-Linux/shared/") # (find-squeaksharedfile "") # (find-squeaksharedfile "Category-Edrx.st") ##### # # OSProcess # 2023jan28 # ##### # «OSProcess» (to ".OSProcess") # http://wiki.squeak.org/squeak/708 OSProcess # (find-squeaksharedfile "") # (find-squeaksharedfile "See.st") # (find-squeaksharedfile "See.st" "\nemacsClientEval: string") ##### # # CommandShell # 2023jan27 # ##### # «CommandShell» (to ".CommandShell") # http://wiki.squeak.org/squeak/1914 CommandShell # http://wiki.squeak.org/squeak/6023 ExternalCommandShell # http://wiki.squeak.org/squeak/2153 Overview of CommandShell # http://wiki.squeak.org/squeak/1064 CommandShell exercise # http://www.squeaksource.com/CommandShell/ # http://wiki.squeak.org/squeak/2819 Invoking Lua from Squeak using OSProcess Command shell <krono> something like #wait, #exec:withArguments: 🤔 # (find-fline "~/LOGS/2023jan27.squeak2") ##### # # See # 2023jan28 # ##### # «See» (to ".See") # (find-squeaksharedfile "") # (find-squeaksharedfile "See.st") # (find-squeaksharedfile "See.st" "\nitem1tsa: menu") See>>sbep0: page "See the method sbep:." ^ 'emacsclient --eval ''(find-squeakbyexpage ' , page , ')'''. See>>sbep: page "Open the book Squeak by Example on a certain page" OSProcess waitForCommand: (See sbep0: page). ##### # # See.st.html # 2023jan28 # ##### # «See.st.html» (to ".See.st.html") # (find-squeaksharedfile "") # (