[comp.lang.smalltalk] LittleSmalltalk under emacs

ott@piyopiyo.hatori.t.u-tokyo.JUNET (ott) (02/09/89)

Some time ago I "ported" LittleSmalltalk to emacs. I basically got
tired of typing in a awful long word just to get a error message,
because I forgot a comma or something and I am terribly slow on the
keyboard. 

I don't know how useful this is, but I have no time to improve the
code and we also got Smalltalk/V which is better suited for me, as I
use smalltalk for graphical user interfaces.

By the way, is anyone out there working on "computer models" for
programming video processors? (what a sentence.) We have developed a
highly parallel computer for real time video processing. As I can't
find any satisfaction in programming 300+ processors on a microcode
level individually, (don't laugh, there are already a few 10000 lines
of code around) I am trying to find a concept to hide the 300+ working
horses. Anyone doing something related?

Have fun if you can use it, otherwise sorry for the length.

-max

p.s. I still would like to hear of any bugs (+ fix) or any extensions.

#--------------------------------CUT HERE-------------------------------------
#! /bin/sh
#
# This is a shell archive.  Save this into a file, edit it
# and delete all lines above this comment.  Then give this
# file to sh by executing the command "sh file".  The files
# will be extracted into the current directory owned by
# you with default permissions.
#
# The files contained herein are:
#
# -rw-r--r--  1 ott          4562 Feb  9 20:49 README
# -rw-r--r--  1 ott           103 Nov 10 20:47 edit.st
# -rw-r--r--  1 ott            46 Nov 10 20:46 emacsEdit.st
# -rw-r--r--  1 ott           118 Nov 10 20:45 emacsInsert.st
# -rw-r--r--  1 ott           211 Feb  9 20:44 emacsRead.st
# -rw-r--r--  1 ott         12977 Feb  9 20:45 smalltalk.el
#
echo 'x - README'
if test -f README; then echo 'shar: not overwriting README'; else
sed 's/^X//' << '________This_Is_The_END________' > README
X
X		       Smalltalk Mode for Emacs
X		       ************************
X
X0. What am I talking about
X==========================
X
XThis package enables you to run "little Smalltalk" inside emacs.
X!!! This uses the UNIX Version
XLittle Smalltalk was developed by 
X
X	Tim Budd
X	Oregon State University
X	Department of Computer Science
X	Corvallis, Oregon 97331 USA
X	(503) 754-3273
X	budd@ cs.orst.edu
X	{tektronix, hp-pcd} !orstcs!budd
X
Xwho I want to congratulate to this program.
X
X1. Introduction
X===============
X
XThis mode runs Tim Budd's Little Smalltalk as inferior of emacs.
XThis makes it possible to use the editor to improve the user
Xinterface. The current Version allows 
X
X	- reediting of prior commands (see smalltalk-cursor)
X	- editing the methods in an other window
X		(no overhead for calling an extra editor)
X	- completion of partly typed words (see smalltalk-tab)
X	- defining useful abbreviations
X	- ...
X
XBasically I am lazy and not too fast with the keyboard. I especially
Xgot frustrated typing a long line, forgetting a single comma and
Xhaving to do it all over again. ( I really like "globalNames
Xat:#...").
X
X2. Files you should have laying around
X======================================
X
X-rw-r--r--  1 ott          3879 Nov 10 20:49 README
X-rw-r--r--  1 ott           103 Nov 10 20:47 edit.st
X-rw-r--r--  1 ott            46 Nov 10 20:46 emacsEdit.st
X-rw-r--r--  1 ott           118 Nov 10 20:45 emacsInsert.st
X-rw-r--r--  1 ott           213 Nov 10 20:46 emacsRead.st
X-rw-r--r--  1 ott         13084 Nov 10 20:48 smalltalk.el
X
X3. Installation
X===============
X
X3.1 Little Smalltalk
X--------------------
X
XIn order to directly edit methods in an other window you need to
Xchange a few methods in class String.
X
X*Add:	
X	- String emacsInsert  (see "emacsInsert.st")
X		adds header and trailer to a string, so emacs can fetch
X		it and display it in an other window.
X
X	- String emacsRead  (see "emacsRead.st")
X		used for feeding a buffer back to Little Smalltalk.
X		The version you got actually writes the contents of
X		the edit buffer into the work buffer just to check
X		if everything is fine. If you dont like it, remove
X		the second last line "string print".
X
X	- String emacsEdit  (see "emacsEdit.st")
X		basically replaces the method String edit.
X
X*Change:
X	- String edit  (see "edit.st")
X		First save the current method under the name editOld.
X		(easily done with editMethod:. Just change the header
X		line "edit" to "editOld" and exit editor.)
X
X		!! be very carful here !!
X		After that (original edit is still defined) change
X		String edit to the method found in the file edit.st
X
XI included a global Variable #emacs, so you can easily use your Little
XSmalltalk outside emacs.
X
XInside emacs set:
X
X	globalNames at:#emacs put: 'yes'
X
XOutside emacs set:
X
X	globalNames at:#emacs put: 'no'  "(or anything else)"
X
X
X3.1 Emacs
X---------
X
XHave a look at the variables in smalltalk.el. Especially set 
X
X	-smalltalk-progname
X	-smalltalk-directory
X	-smalltalk-prompt     (if you have changed Tim's default)
X
Xto the proper values.
X
XYou also might want to redefine the abbrev table and the
Xkey-mode-maps. I am working on different terminals and did not bother
Xtoo much with the key-maps.
X
XA line from my .emacs file might also be useful
X
X(autoload 'littleSmalltalk "smalltalk.el" "provide nice environment for \
XlittleSmalltalk" t)
X
X
XNow you only need to run
X
X	M-x eval-current-buffer
X
Xin the smalltalk-el window, and
X
X	M-x littleSmalltalk
X
Xshould start the baby.
X
X4. User Manual
X==============
X
XType C-h m in either the *Little SmallTalk* window or *SmallMethod*.
XThe rest can be found in the documentation of the different functions.
X
XEspecially check out: smalltalk-tab and smalltalk-cursor, they really
Xmake life easier.
X
X
X5. Things to do
X===============
X
X- a proper st-indent-command
X	I don't know enough about smalltalk yet to write down the
X	specifications .
X
X- one could reinstate "<-" at the command level with a string
X	substitution 
X
X- Abbrev file should be stored using the newest image Name
X
X- and lots more
X
X6. Bugs, Comments & Abuse
X=========================
X
XBugs, sure there are some.
X
XEditing a method, sometimes or maybe always ignores the first input
Xcharacter. 
X
XIf you find any more, or if you write some new fancy additions, please
Xlet me know.
X
X	Max Ott
X	Hatori Laboratory
X	Dept. of E.E.; U of Tokyo
X	+(81)-(03) 812 2111 Ext. 6761
X
X	e-mail:
X             ott@piyopiyo.hatori.t.u-tokyo.junet@relay.cs.net
X
XBy the way. If anyone out there has tried to port some graphic
Xpackages under X11 to this wounderful little program, I would like to
Xhear from you.
________This_Is_The_END________
if test `wc -c < README` -ne 4562; then
	echo 'shar: README was damaged during transit (should have been 4562 bytes)'
fi
fi		; : end of overwriting check
echo 'x - edit.st'
if test -f edit.st; then echo 'shar: not overwriting edit.st'; else
sed 's/^X//' << '________This_Is_The_END________' > edit.st
Xedit
X	( (globalNames at:#emacs) = 'yes' )
X	  ifFalse: [ ^self editOld ]
X	  ifTrue: [ ^self emacsEdit ]
________This_Is_The_END________
if test `wc -c < edit.st` -ne 103; then
	echo 'shar: edit.st was damaged during transit (should have been 103 bytes)'
fi
fi		; : end of overwriting check
echo 'x - emacsEdit.st'
if test -f emacsEdit.st; then echo 'shar: not overwriting emacsEdit.st'; else
sed 's/^X//' << '________This_Is_The_END________' > emacsEdit.st
XemacsEdit
X	self emacsInsert.
X	^self emacsRead
________This_Is_The_END________
if test `wc -c < emacsEdit.st` -ne 46; then
	echo 'shar: emacsEdit.st was damaged during transit (should have been 46 bytes)'
fi
fi		; : end of overwriting check
echo 'x - emacsInsert.st'
if test -f emacsInsert.st; then echo 'shar: not overwriting emacsInsert.st'; else
sed 's/^X//' << '________This_Is_The_END________' > emacsInsert.st
XemacsInsert  "write string surrounded by a header and trailer line"
X	'**emacs<' print.
X	self print.
X	'**emacs>' print
________This_Is_The_END________
if test `wc -c < emacsInsert.st` -ne 118; then
	echo 'shar: emacsInsert.st was damaged during transit (should have been 118 bytes)'
fi
fi		; : end of overwriting check
echo 'x - emacsRead.st'
if test -f emacsRead.st; then echo 'shar: not overwriting emacsRead.st'; else
sed 's/^X//' << '________This_Is_The_END________' > emacsRead.st
XemacsRead   |input string|
X	string <- ''. input <- ''.
X	[ 
X	  string <- string con: input seperator: '
X'.
X	  input <- stdin getPrompt: ''.
X          (input = '**emacs@') not ]whileTrue.
X	string print.
X	^ string
________This_Is_The_END________
if test `wc -c < emacsRead.st` -ne 211; then
	echo 'shar: emacsRead.st was damaged during transit (should have been 211 bytes)'
fi
fi		; : end of overwriting check
echo 'x - smalltalk.el'
if test -f smalltalk.el; then echo 'shar: not overwriting smalltalk.el'; else
sed 's/^X//' << '________This_Is_The_END________' > smalltalk.el
X;; Run Little Smalltalk as inferior of Emacs, and allow editing in emacs too
X;;
X;; I used large chunks from fortran.el, shell.el and various other files
X;;
X
X;;; ***********  Adjust for your site
X
X(defvar smalltalk-progname "st"
X  "Name of Little Smalltalk program.")
X
X(defvar smalltalk-prompt "^>	"
X  "how does yor Little SmallTalk prompt? ")
X
X(defvar smalltalk-directory (getenv "SMALLTALK_DIR")
X  "Name of directory where you work using smalltalk. Default is
Xenvironment SMALLTALK_DIR")
X
X;;;***************the rest should be ok
X
X(defvar smalltalk-buffer "*Little SmallTalk*"
X  "name of buffer where all the fun will take place")
X
X(defvar smalltalk-edit-buffer "*smallMethod*"
X  "name of buffer in which temp. smalltalk files will be edited")
X
X(defvar smalltalk-insert-start "**emacs<"
X  "how does the message from emacsInsert begin?")
X
X(defvar smalltalk-insert-end "**emacs>"
X  "how does the message from emacsInsert end?")
X
X(defvar smalltalk-send-end "**emacs@"
X  "This indicates the end of a sent buffer. (see <st-send-buffer>)")
X
X(defvar smalltalk-insert-in-process nil
X  "non-nil if receiving insert block from smalltalk")
X
X(defvar smalltalk-startup-message t
X  "*Non-nil displays a startup message when smalltalk-mode is first called.")
X(defconst smalltalk-mode-version "1.0")
X(defconst smalltalk-my-address 
X  "ott@piyopiyo.hatori.t.u-tokyo.junet@relay.cs.net")
X
X(defvar smalltalk-process nil
X  "Process created by littleSmalltalk command, or nil if none exists now.
XNote that the process may have been \"deleted\" and still
Xbe the value of this variable.")
X
X(defvar default-image nil
X  "name of default image for smalltalk")
X
X(defvar last-input-start nil
X  "In a smalltalk-mode buffer, marker for start of last unit of input.")
X(defvar last-input-end nil
X  "In a smalltalk-mode buffer, marker for start of last unit of input.")
X
X(defvar LF ?\n)
X(defvar TAB (format "%c" ?\t))
X(defvar SPC " ")
X
X(defvar smalltalk-abbrev-table nil)
X(if smalltalk-abbrev-table
X    ()
X  (define-abbrev-table 'smalltalk-abbrev-table ())
X  (let ((abbrevs-changed nil))
X    (define-abbrev smalltalk-abbrev-table  "em"	"editMethod: #")
X    (define-abbrev smalltalk-abbrev-table  "am"	"addMethod")
X    (define-abbrev smalltalk-abbrev-table  "vm"	"viewMethod: #")
X    (define-abbrev smalltalk-abbrev-table  "asc"	"addSubClass")
X    (define-abbrev smalltalk-abbrev-table  "gn"	"globalNames at: #")
X    (define-abbrev smalltalk-abbrev-table  "res"	"respondsTo display")
X;;    (define-abbrev smalltalk-abbrev-table  "."	"")
X    ))
X
X(defun back-1 () (backward-char 1))
X
X(defun smalltalk-space ()
X  "abbreviation always adds <space> after expanding. This should not do it"
X  (interactive)
X  (if (not (expand-abbrev))   
X	(insert-char ?  1)))
X
X(defvar st-work-mode-map () 
X  "Keymap used in smalltalk-work mode.")
X(if st-work-mode-map
X    ()
X  (setq st-work-mode-map (make-sparse-keymap))
X  (define-key st-work-mode-map SPC	'smalltalk-space)
X  (define-key st-work-mode-map "\C-p"	'smalltalk-cursor-up)
X  (define-key st-work-mode-map "\C-n"	'smalltalk-cursor-down)
X  (define-key st-work-mode-map "\C-m"   'smalltalk-send)
X  (define-key st-work-mode-map "\C-a"   'st-beginning-of-line)
X  (define-key st-work-mode-map "\C-c\C-c"   'smalltalk-kill)
X  (define-key st-work-mode-map "\C-c\C-l"   'smalltalk-recenter)
X  (define-key st-work-mode-map TAB      'smalltalk-tab))
X
X(defvar st-edit-mode-map () 
X  "Keymap used in smalltalk mode.")
X
X(if st-edit-mode-map
X    ()
X  (setq st-edit-mode-map (make-sparse-keymap))
X  (define-key st-edit-mode-map "\eOPs"	'st-edit-finished)
X  (define-key st-edit-mode-map "\C-c\C-s"	'st-edit-finished)
X  (define-key st-edit-mode-map "\C-cs"	'st-edit-finished))
X
X(defun smalltalk-mode (kind)
X  "This mode provides a nicer environment for playing around with 
XLittleSmalltalk. This program runs through emacs.
X
XThe main advantage, at least for me, are the possibilities of defining
Xabbrev to make dealing with this long words a bit easier. The other thing
Xis that the editing of the methods will happen just in an other window.
XAfter finishing there, work continues in the normal buffer.
X
XThe following commands are defined. Look at their function definition
Xfor more infos.
X
XIn SmallWork:
X\\{st-work-mode-map}
X
XIn SmallEdit:
X\\{st-edit-mode-map}"
X  (interactive)
X  (kill-all-local-variables)
X  (if (equal kind "edit")
X	(progn
X	  (setq mode-name "SmallEdit")
X	  (use-local-map st-edit-mode-map))
X    (progn
X      (setq mode-name "SmallWork")
X      (use-local-map st-work-mode-map)))
X  (setq major-mode 'smalltalk-mode)
X;;  (modify-syntax-entry ?\. "w")
X  (setq local-abbrev-table smalltalk-abbrev-table)
X;;  (set-syntax-table smalltalk-mode-syntax-table)
X  (abbrev-mode 1)
X  (run-hooks 'smalltalk-mode-hook))
X
X(defun littleSmalltalk (image)
X  "start little smalltalk"
X  (interactive (list (read-string "Image: " default-image)))
X  (setq default-image image)
X  (switch-to-buffer (get-buffer-create smalltalk-buffer))
X  (widen) (erase-buffer)
X  (smalltalk-mode "work")
X  ;;
X  ;; local variables
X  (make-local-variable 'last-input-start)
X  (setq last-input-start (make-marker))
X  (make-local-variable 'last-input-end)
X  (setq last-input-end (make-marker))
X  (make-local-variable 'scroll-step)
X  (setq scroll-step 1)
X  ;;
X  ;; start process
X  (let ((live (and smalltalk-process
X		   (eq (process-status smalltalk-process) 'run))))
X    (if (not live)
X	(save-excursion
X	  (if smalltalk-process
X	      (delete-process smalltalk-process))
X	  (cd smalltalk-directory)
X	  (setq smalltalk-process nil)
X	  (setq smalltalk-process
X		(start-process "smalltalk" smalltalk-buffer 
X			       smalltalk-progname  image))
X	  (set-process-filter smalltalk-process 'smalltalk-filter)
X	  (process-kill-without-query smalltalk-process)
X	  )))
X  (setq abb-file (concat smalltalk-directory "/" default-image ".abb"))
X  (if (file-exists-p abb-file)
X      (quietly-read-abbrev-file abb-file)
X      (let ((abb-default-file (concat smalltalk-directory "/.abbrev\_defs")))
X       (if (file-exists-p abb-default-file)
X	   (quietly-read-abbrev-file abb-default-file))))
X  (if smalltalk-startup-message
X      (message "Smalltalk-mode V%s.  Bugs to %s" 
X	smalltalk-mode-version smalltalk-my-address))
X  (setq smalltalk-startup-message nil))
X
X(defun st-edit-start ()
X  "called after smalltalk-insert is finished"
X  (switch-to-buffer-other-window smalltalk-edit-buffer)
X  (smalltalk-mode "edit")
X  (message "I'm ready.  Finish editing with GOLD-s, C-cC-s or C-cs")
X  )
X
X(defun st-edit-finished ()
X  "After editing of a smalltalk file is finished, this function should be 
Xcalled. This will send the buffer to smalltalk and return to workbuffer."
X  (interactive)
X  (st-send-buffer)
X  (goto-char (point-min))
X  (switch-to-buffer-other-window smalltalk-buffer)
X  )
X
X;;;;************************************************
X;;;;
X;;;; useful or not so useful commands
X;;;;
X
X(defun smalltalk-cursor-up ()
X  "see <smalltalk-cursor>"
X  (interactive)
X  (smalltalk-cursor 1))
X
X(defun smalltalk-cursor-down ()
X  "see <smalltalk-cursor>"
X  (interactive)
X  (smalltalk-cursor -1))
X
X
X(defun smalltalk-cursor (dir)
X  "is cursor at end of buffer then <cursor-up> and <cursor-down> step through
Xthe command history and display that string on the line.
XCalling from a program DIR negative searches back in history, a positive 
Xforward."
X  (interactive)
X  (if (eobp)
X      (progn
X	(goto-char smalltalk-history)
X	(if (< dir 0)
X	    (progn
X	      (end-of-line)
X	      (if (not (re-search-forward smalltalk-prompt nil t))
X		  (message "This is the last input command")))
X	    (progn
X	      (beginning-of-line)
X	      (if (not (re-search-backward smalltalk-prompt nil t))
X		  (message "This is already the first input command"))))
X	(setq smalltalk-history (point))
X	(let ((copy (buffer-substring 
X		     (progn 
X		       (beginning-of-line)
X		       (re-search-forward smalltalk-prompt nil t)
X		       (point))
X		     (progn (end-of-line) (point)))))
X;;	  (goto-char (process-mark (get-buffer-process (current-buffer))))
X	  (goto-char last-input-start)
X	  (if (not (eobp))
X	      (kill-line))
X	  (insert copy)))
X	(if (< dir 0)
X	    (forward-line 1)
X	  (forward-line -1))))
X
X(defun smalltalk-tab  ()
X  "A TAB at the last line tries to complete the so far typed word with
Xthe first found word with the same beginning"
X  (interactive)
X  (if (eobp)
X	(let ((copy (concat "\\b" 
X			    (buffer-substring 
X			     (progn (forward-word -1)(point)) 
X			     (point-max)))))
X	  (if (re-search-backward copy nil t)
X	      (progn
X		(setq complete (buffer-substring (match-end 0)
X				  (progn
X				    (while (not (looking-at " \\|$"))
X				      (forward-char 1))
X				    (point))))
X		;;(message "complete: <%s>" complete)
X		(goto-char (point-max))
X		(insert complete))
X	    (progn
X	      (message "can't find any completion")
X	      (goto-char (point-max)))))
X    (insert "	")))
X
X(defun st-recenter ()
X  "tries to drag down current cursor to the bottom of the window. 
XAll the scrolling might be sometimes annoying. Can't find a way to stop
Xemacs from putting the point in the middle in the first place."
X  (interactive)
X  (save-excursion
X    (if (re-search-backward smalltalk-prompt beg-string t)
X	(recenter (- (window-height) 2)))))
X
X(defun st-beginning-of-line ()
X  "same as beginning-of-line, but if looking at the smalltalk-prompt
Xsets point after it. Useful by stepping through command-history"
X  (interactive)
X  (beginning-of-line 1)
X  (if (looking-at smalltalk-prompt)
X      (goto-char (match-end 0))))
X
X(defun smalltalk-kill ()
X  "send kill to smalltalk process and clean environment"
X  (interactive)
X  (if (yes-or-no-p "have you saved the image? ")
X   (progn
X     (delete-process smalltalk-process)
X     (kill-buffer smalltalk-buffer)
X     (setq smalltalk-process nil)
X     )
X   ))
X
X;;;;************************************************
X;;;;
X;;;; functions dealing with the outside process
X;;;;
X
X(defun smalltalk-filter (proc string)
X  "Insert message von Little Smalltalk after point and recenter prompt
Xat last line."
X  (if smalltalk-insert-in-process
X      (st-insert-editbuffer string)
X    (if (string-match smalltalk-insert-start string)
X	(st-insert-editbuffer-start string)
X      (st-insert-workbuffer string))))
X
X(defun smalltalk-send ()
X  "send input to SmallTalk.
XAt end of buffer, sends all text after last output
X as input to the subshell, including a newline inserted at the end.
XNot at end, copies current line to the end of the buffer and sends it,
Xafter first attempting to discard any prompt at the beginning of the line
Xby matching the regexp that is the value of shell-prompt-pattern if possible.
XThis regexp should start with \"^\"."
X  (interactive)
X  (end-of-line)
X    (if (eobp)
X	(progn
X;;	  (move-marker last-input-start
X;;		       (process-mark (get-buffer-process (current-buffer))))
X	  (insert ?\n)
X	  (move-marker last-input-end (point)))
X      (beginning-of-line)
X      (re-search-forward smalltalk-prompt nil t)
X      (let ((copy (buffer-substring (point)
X				    (progn (forward-line 1) (point)))))
X	(goto-char (point-max))
X	(move-marker last-input-start (point))
X	(insert copy)
X	(move-marker last-input-end (point))))
X    (setq smalltalk-history (point))
X    (let ((process (get-buffer-process (current-buffer))))
X      (process-send-region process last-input-start last-input-end)
X      (set-marker (process-mark process) (point))))
X
X(defun st-insert-workbuffer (string)
X  "insert STRING in *SmallWork*"
X  (set-buffer smalltalk-buffer)
X  (setq beg-string (point))
X  (insert string)
X  (move-marker last-input-start (point))
X  (st-recenter))
X
X(defun st-insert-editbuffer-start (string)
X  "called when smalltalk-filter finds smalltalk-insert-start string"
X  (setq smalltalk-insert-in-process t)
X  (set-buffer (get-buffer-create smalltalk-edit-buffer))
X  (widen) (erase-buffer)
X  (st-insert-editbuffer (substring string (match-end 0)))
X  )
X
X(defun st-insert-editbuffer (string)
X  "receives STRING from st to be inserted in buffer *SmallEdit*.
XIt watches out for string smalltalk-insert-end. If found it resets flag
Xsmalltalk-insert-in-process. Then it should call something like smalltalk-edit"
X  (set-buffer smalltalk-edit-buffer)
X  (if (string-match smalltalk-insert-end string)
X      (let ((rest (substring string (match-end 0))))
X	(insert (substring string 0 (match-beginning 0)))
X	;; there are always extra empty lines around text, kill them
X	(while (looking-at "^$") (delete-char -1))
X	(goto-char (point-min))
X	(while (looking-at "^$") (delete-char 1))
X	(setq smalltalk-insert-in-process nil)
X	(st-insert-workbuffer rest)
X	(st-edit-start))
X    (insert string))
X  )
X
X
X(defun st-send-buffer ()
X  "send contents of buffer to process smallTalk"
X  (goto-char (point-min))
X  (while (not (equal (point) (point-max)))
X    (process-send-region 
X     (get-buffer-process smalltalk-buffer)
X     (point)
X     (progn (forward-line 1) (point)))
X    ;;;(message "%d : %d" (point) (point-max))  ;;; !!!delete
X    )
X  (send-string
X   (get-buffer-process smalltalk-buffer)
X   (format "%c%s%c"  LF smalltalk-send-end LF))
X  )
X
________This_Is_The_END________
if test `wc -c < smalltalk.el` -ne 12977; then
	echo 'shar: smalltalk.el was damaged during transit (should have been 12977 bytes)'
fi
fi		; : end of overwriting check
exit 0
------------------------------------------------------------------------------
Max Ott			     e-mail:
Hatori Laboratory             ott@piyopiyo.hatori.t.u-tokyo.junet@relay.cs.net
Dept. of E.E.; U of Tokyo
+(81)-(03) 812 2111 Ext. 6761

mh@wlbr.EATON.COM (Mike Hoegeman) (02/11/89)

I'm interested in porting some flavor of smalltalk to the NeWS window
system , little smalltalk seems to be a good candidate from what i've seen
in various articles. now the question is where can i get it from
is there a machine i can ftp it off of ? can someone mail it to me ??

thanks in advance,

mike, (mike@etn-wlv.eaton.com or mh@wlbr.eaton.com)