[comp.emacs] gnuemacs programmers guide

ekberg@home.UUCP (09/28/87)

Does anyone out there know of a programmers guide for gnuemacs?  After
reviewing some of the source files I can do some minimal coding (being
proficient in Common Lisp helps) but there are some things that would be
difficult to know by just reading the code.  Even a summary of all of the forms
would help (yes, I have looked at the documentation string but even that isn't
enough).  Well, how about it?

-- 
  -- tom (aisle C-4L), EKBERG%TI-CSL@CSNET-RELAY

dph@beta.UUCP (David P Huelsbeck) (09/28/87)

In article <527@home.CSNET> ekberg@home.CSNET (Tom Ekberg) writes:
>Does anyone out there know of a programmers guide for gnuemacs?  After
 [...]
> Even a summary of all of the forms
>would help (yes, I have looked at the documentation string but even that isn't
>enough).  Well, how about it?
>
>-- 
>  -- tom (aisle C-4L), EKBERG%TI-CSL@CSNET-RELAY


Yes. This would be a big help.

How 'bout it, is there such a thing?

Where can I get it?

	David Huelsbeck
	dph@lanl.gov.arpa
	{cmcl2,ihnp4}!lanl!gov

PS: I've looked at the files on "prep" a little lately.
    I can't seem to find the "split" copys of the latest
    versions (actually any version). 3MB is a pretty big
    chunk to ftp in one shot. I'm not ready to stay up 
    from 2AM until 5AM to get it. Is the split version of
    48 or 49 out there somewhere?

duff@eraserhead.UUCP (09/30/87)

In article <10651@beta.UUCP> dph@LANL.GOV.ARPA (David P Huelsbeck) writes:
>In article <527@home.CSNET> ekberg@home.CSNET (Tom Ekberg) writes:
>>Does anyone out there know of a programmers guide for gnuemacs?  After
> [...]
>> Even a summary of all of the forms
>>would help (yes, I have looked at the documentation string but even that isn't
>>enough).  Well, how about it?
>
>Yes. This would be a big help.
>

Well, at one time, there was an outline of the programmers manual floating
around and I got a copy of it.  I found it useful sometimes when I was trying
to figure out how to do certain tasks becuase it grouped all of the commands
according to their general function.  Here is an (almost surely out-of-date)
copy that I have been using for a while.  

If anyone has a more current or more detailed one, I think it would be nice to
post it.

I recieved this (indirectly) from liberte@b.cs.uiuc.edu (Daniel LaLiberte).

================
Posted-Date: 11 Mar 87 10:47 EST
>From: liberte%b.cs.uiuc.edu.tcpip@csbvax.steinmetz
Subject: updated outline
To: MONTANARO@MONA.steinmetz

Received: from b.cs.uiuc.edu by a.cs.uiuc.edu with SMTP (UIUC-5.44/9.7)
	id AA01450; Wed, 11 Mar 87 02:08:05 CST
Received: by b.cs.uiuc.edu (UIUC-5.52/9.7)
	id AA13131; Wed, 11 Mar 87 02:06:35 CST
Date: Wed, 11 Mar 87 02:06:35 CST
>From: liberte@b.cs.uiuc.edu (Daniel LaLiberte)
Message-Id: <8703110806.AA13131@b.cs.uiuc.edu>
To: gnu-manual@a.cs.uiuc.edu
Subject: updated outline

Here is the updated outline as of 18.37 or so.  It is a little bit
reorganized, but looking it over, it should be obvious that it needs
some major overhaul.  I got tired of trying to figure out where every
little thing should go.  In the real manual, I would expect lots of
cross references.

When you decide that you want to write about one of these sections,
or part of a section, or even just an introduction for a section, then
you might also consider how to reorganize it, what things should go
where, etc.

dan
(our ARPAnet connection will be intermittent for a while - keep trying)
-----------------

Copyright (C) 1986 Daniel LaLiberte

GNU Emacs Programmers Manual (outline)

GNU Emacs Lisp

Part I.  Lisp.

Objects and types: 
	atom, integer, symbol, cons, lists, vector, string,
	buffer, marker, built-in-function, window, process

Lists:
	atom
	cons
	list
	make-list
	eq
	equal
	null
	consp
	listp
	nlistp
	sequencep
	car
	car-safe
	cdr
	cdr-safe
	setcar
	setcdr
	append
	nthcdr
	nth

	copy-alist
	memq
	assq
	assoc
	rassq
	delq

	nreverse
	reverse
	sort
	nconc
	mapconcat
	mapcar

Numbers:
	integerp
	natnump
	zerop
	integer-or-marker-p
	= < > <= >= /=
	int-to-string
	string-to-int
	+ - * / %
	1+
	1-
	max
	min
	longand
	logior
	logxor
	lognot
	ash
	lsh
	random

Arrays Vectors Sequences:
	make-vector
	vector
	vectorp
	stringp
	arrayp
	sequencep
	aref
	aset
	vconcat
	copy-sequence
	length
	elt
	fillarray

Characters and Strings:
	make-string
	stringp
	char-or-stringp
	int-to-string
	string-to-int
	char-to-string
	string-to-char
	concat
	substring
	string-equal
	string-lessp
	char-equal

Symbols: 
	General
		name, value as variable, function definition, 
		property list,
	get
	put
	intern
	intern-soft
	mapatoms
	make-symbol
	symbolp
	boundp
	fboundp
	makunbound
	fmakeunbound
	symbol-function
	symbol-plist
	symbol-name
	symbol-value
	default-value
	fset
	setplist
	set
	set-default

	copy-alist
	assq

	Variables
	obarray
	values

Garbage
	purecopy
	garbage-collect

	Variables
	gc-cons-threshold
	pure-bytes-used
	data-bytes-used
	data-bytes-free
	purify-flag

Lisp expressions:
	variables vs constants vs 
		function calls vs special forms (a funny sort of function call)
	Mention eval setq quote.
	Macros  
		defmacro 
		macroexpand

Functions:
	subrp
	function
	eval
	apply
	funcall
	mapatoms
	mapconcat
	mapcar

	defun 
	defmacro
	macroexpand
	autoload
	fboundp
	fmakunbound

	Simple args and rest args.
	identity


	call-interactively
	universal-argument
	digit-argument
	negative-argument
	prefix-numeric-value
	interactive
	interactive-p
	commandp

	documentation
	documentation-property
	Snarf-documentation
	substitute-command-keys


	Variables
	prefix-arg
	current-prefix-arg
	command-history


Variables and binding:
	setq
	defvar
	defconst
	boundp
	makunbound
	Explain dynamic (vs lexical) scope.
	let let*
	Variables that Emacs primitives look at vs.
	Variables that users may access
	user-variable-p
	set-variable
	Per-buffer variables (there are two kinds of these)
		make-variable-buffer-local
		make-local-variable
	global-value
	global-set
	hack-local-variables


Control Structures
	progn
	prog1
	prog2
	or
	and
	cond
	if
	while
	catch
	throw
	unwind-protect
	condition-case
	signal

Errors
	unwind-protect
	condition-case
	signal
	error
	backtrace-debug
	backtrace

Evaluation, Compilation, and Debugging
	load
	auto-load
	provide
	require
	featurep
	eval-region
	eval-current-buffer
	eval-expression
	edit-and-eval-command
	byte-compile-file
	byte-recompile-directory
	batch-byte-compile
	byte-code
	disassemble

	debug
	debug-on-entry
	cancel-debug-on-entry

	Variables
	features
	load-path
	load-in-progress

	max-specpdl-size
	max-lisp-eval-depth
	quit-flag
	inhibit-quit
	stack-trace-on-error
	debug-on-error
	debug-on-quit
	debug-on-next-call
	debugger


Lisp I/O to streams.
	read
	read-from-string
	print
	prin1
	princ
	Strings as streams.  
	Buffers as streams.  
	Markers as streams.
	Functions as streams.
	Minibuffer streams.

	scan-lists
	scan-sexps
	parse-partial-sexp

	Variables
	parse-sexp-ignore-comments


------------------------------------------------------


Part II.  Lisp and Editing

	top-level
	recursion-depth
	recursive-edit
	exit-recursive-edit
	abort-recursive-edit
	save-excursion

Buffers
	buffer-list
	get-buffer
	get-file-buffer
	get-buffer-create
	generate-new-buffer
	buffer-name
	buffer-number
	buffer-file-name
	buffer-local-variables
	buffer-modified-p
	set-buffer-modified-p
	rename-buffer
	other-buffer
	buffer-flush-undo
	kill-buffer
	kill-some-buffers
	switch-to-buffer
	switch-to-buffer-other-window
	pop-to-buffer
	current-buffer
	set-buffer
	barf-if-buffer-read-only
	bury-buffer
	erase-buffer
	list-buffers
	lock-buffer
	unlock-buffer

	buffer-size
	point-min
	point-min-marker
	point-max
	point-max-marker

	
Standard per-buffer variables and their uses

	make-variable-buffer-local
	make-local-variable
	kill-local-variable
	kill-all-local-variables

	Variables
	mode-line-format default-mode-line-format
	abbrev-mode default-abbrev-mode
	ctl-arrow default-ctl-arrow
	truncate-lines default-truncate-lines
	fill-column default-fill-column
	left-margin default-left-margin
	tab-width default-tab-width
	case-fold-search default-case-fold-search
	major-mode default-major-mode 

	mode-name
	default-directory
	auto-fill-hook

	make-backup-files
	bacup-by-copying
	backup-by-copying-when-linked
	backup-by-copying-when-mismatch

	buffer-offer-save
	file-procious-flag
	version-control
	dired-kept-versions
	dired-listing-switches
	trim-versions-without-asking
	kept-old-versions
	kept-new-versions
	require-final-newline
	auto-save-default
	auto-save-visited-file-name
	save-abbrevs
	find-file-run-dired
	find-file-not-found-hooks
	find-file-hooks
	write-file-hooks

	buffer-auto-save-file-name
	buffer-read-only
	buffer-backed-up
	buffer-saved-size
	selective-display
	selective-display-ellipses
	overwrite-mode



Positions
	point
	window-point
	set-window-point
	register-to-point
	point-to-register
	buffer-size
	point-max
	point-min
	bobp
	eobp
	bolp
	eolp
	beginning-of-buffer
	end-of-buffer
	goto-char
	goto-line
	what-line
	what-cursor-position
	forward-char
	backward-char
	forward-line
	beginning-of-line
	end-of-line
	move-to-column
	current-column
	vertical-motion
	next-line
	previous-line
	set-goal-column

	following-char
	preceding-char
	char-after
	buffer-substring
	buffer-string


	markers
	mark
	set-mark
	set-mark-command
	exchange-point-and-mark
	pop-mark
	push-mark
	process-mark
	abbrev-prefix-mark
	mark-marker
	mark-word
	mark-paragraph
	mark-sexp
	mark-page
	mark-whole-buffer

	markerp
	integer-or-marker-p
	make-marker
	set-marker
	copy-marker
	point-max-marker
	point-min-marker
	marker-position
	marker-buffer
	point-marker
	insert-before-markers

	region-beginning
	region-end
	count-lines-region
	count-lines

	clipping restrictions
	narrow-to-page
	narrow-to-region
	widen
	point-max
	point-min

	point-max-marker
	point-min-marker
	save-restriction

	Variables
	track-eol
	goal-column
	temporary-goal-column

	mark-ring
	mark-ring-max


Inserting and Deleting
	insert
	quoted-insert
	insert-before-markers
	self-insert-and-exit
	self-insert-command
	insert-buffer-substring
	newline
	split-line
	open-line

	delete-region
	subst-char-in-region

	indent-to
	current-indentation
	delete-indentation
	back-to-indentation
	newline-and-indent
	reindent-then-newline-and-indent
	forward-to-indentation
	backward-to-indentation
	indent-according-to-mode
	indent-for-tab-command
	indent-rigidly
	indent-region
	indent-relative-maybe
	indent-relative

	edit-tab-stops-note-changes
	tab-to-tab-stop


	fixup-whitespace
	delete-horizontal-space
	just-one-space
	delete-blank-lines
	backward-delete-char-untabify
	zap-to-char
		
	delete-char
	delete-backward-char
	kill-line
	kill-region


	Variables
	indent-tabs-mode
	indent-region-function
	tab-stop-list
	edit-tab-stops-map
	edit-tab-stops-buffer
	indent-line-function

	kill-ring
	kill-ring-max
	kill-ring-yank-pointer


Commands
	enable-command
	disable-command

	Self-inserting commands

	auto-fill
	parenthesis matching
	Abbreviations - all the variables
	blink-matching-open

	Variables
	blink-paren-hook
	blink-matching-paren
	blink-matching-paren-distance


Undo
	undo
	buffer-flush-undo
	undo-boundary
	undo-more
	undo-start
	buffer-modified


Searching and matching

	looking-at
	string-match
	scan-buffer
	skip-chars-forward
	skip-chars-backward
	search-backward
	search-forward
	word-search-backward
	word-search-forward
	re-search-backward
	re-search-forward
	replace-match
	match-beginning
	match-end
	match-data
	store-match-data
	regexp-quote

	backward-prefix-chars

	Variables
	paragraph-start
	paragraph-separate
	sentence-end
	page-delimiter
	case-replace



Parsing and scanning

Syntax Tables
	syntax-table-p
	syntax-table
	standard-syntax-table
	copy-syntax-table
	set-syntax-table
	char-syntax
	modify-syntax-entry
	describe-syntax

	Variables
	standard-syntax-table



Major and Minor Modes
	fundamental-mode
	normal-mode
	set-auto-mode
	hack-local-variables
	run-hooks
	

	Variables

	fundamental-mode-map
	mode-specific-map
	help-map
	mode-line-buffer-identification
	mode-line-process
	initial-major-mode
	minor-mode-alist
	auto-mode-alist
	command-switch-alist

 
Keyboard Macros

	Variables
	defining-kbd-macro
	executing-macro
	executing-kbd-macro
	last-kbd-macro

Keymaps
	keymapp
	make-keymap
	make-sparse-keymap
	define-key
	lookup-key
	key-binding
	local-key-binding
	global-key-binding
	global-set-key
	local-set-key
	global-unset-key
	local-unset-key
	define-prefix-command
	use-global-map
	use-local-map
	current-local-map
	accessible-keymaps
	key-description
	single-key-description
	text-char-description
	where-is-internal
	where-is
	describe-bindings
	apropos
	execute-extended-command
	substitute-command-keys
	suppress-keymap
	substitute-key-definition

	Variables
	global-map
	function-keymap
	ctl-x-4-map
	ctl-x-map
	esc-map
	mouse-map



Minibuffer:
	read-from-minibuffer
	read-minibuffer
	eval-minibuffer
	read-string
	read-no-blanks-input
	read-command
	read-function
	read-variable
	read-buffer
	try-completion
	all-completions
	minibuffer-complete
	minibuffer-complete-and-exit
	minibuffer-completion-help
	self-insert-and-exit
	exit-minibuffer

	y-or-n-p
	yes-or-no-p

	Relate this to interactive.
	Minibuffer keymaps.

	Variables
	cursor-in-echo-area
	minibuffer-local-map
	minibuffer-local-ns-map
	minibuffer-local-completion-map
	minibuffer-local-must-match-map

	completion-auto-help
	completion-ignore-case
	completion-ignored-extensions
	enable-recursive-minibuffers
	minibuffer-completion-table
	minibuffer-completion-predicate
	minibuffer-completion-confirm
	minibuffer-help-form



Input/Output - this really needs work

	baud-rate
	send-string-to-terminal

	read-quoted-char
	read-key-sequence
	command-execute
	input-pending-p
	recent-keys
	this-command-keys
	open-dribble-file
	open-termscript

	discard-input
	set-input-mode

	message
	format

	write-char
	with-output-to-temp-buffer
	terpri
	prin1
	prin1-to-string
	princ
	print
	read-char
	get-file-char

	read
	read-from-string

	momentary-string-display

	sit-for
	sleep-for
	ding

	keyboard-quit

	Variables
	standard-output
	standard-input
	print-length

	inverse-video
	visible-bell
	window-system

	disabled-command-hook
	meta-flag
	last-command-char
	last-input-char
	unread-command-char
	meta-prefix-char
	last-command
	this-command
	auto-save-interval
	echo-keystrokes
	help-char
	help-form
	top-level
	keyboard-translate-table



Files
	File data transfer.
	File manipulation.

	list-directory
	directory-files
	file-name-completion
	file-name-all-completions
	file-name-all-versions
	file-attributes
	file-locked-p


	file-name-directory
	file-name-nondirectory
	file-name-as-directory
	directory-file-name
	make-temp-name
	expand-file-name
	substitute-in-file-name
	copy-file
	delete-file
	rename-file
	add-name-to-file
	make-symbolic-link
	define-logical-name
	file-name-absolute-p
	file-exists-p
	file-readable-p
	file-writable-p
	file-symlink-p
	file-directory-p
	file-modes
	set-file-modes
	file-newer-than-file-p
	verify-visited-file-modtime
	clear-visited-file-modtime


	file-nlinks


	recover-file
	kill-some-buffers
	auto-save-mode
	make-auto-save-file-name
	auto-save-file-name-p
	save-buffers-kill-emacs

	normal-mode
	set-auto-mode
	hack-local-variables

	set-visited-file-name
	write-file
	backup-buffer
	file-name-sans-version
	make-backup-file-name
	backup-file-name-p
	find-backup-file-name
	save-buffer
	basic-save-buffer
	delete-auto-save-file-if-necessary
	basic-save-buffer
	save-some-buffers
	not-modified
	toggle-read-only

	do-auto-save
	set-buffer-auto-saved
	recent-auto-save-p
	read-file-name-internal
	read-file-name


	insert-file-contents
	insert-file
	append-to-file
	revert-buffer
	recover-file

	write-region
	verify-visited-file-modtime
	clear-visited-file-modtime

	load-file
	load-library

	find-file
	find-file-other-window
	find-file-read-only
	find-alternate-file
	create-file-buffer
	find-file-noselect
	after-find-file
	
	delete-auto-save-files
	auto-save-mode
	rename-auto-save-file
	make-auto-save-file-name
	auto-save-file-name-p

	Variables
	insert-default-directory
	revert-buffer-function
	list-directory-brief-switches
	list-directory-verbose-switches

	vms-stmlf-recfm
	lpr-switches
	tags-file-name



Windows
	windowp
	pos-visible-in-window-p
	window-buffer
	window-height
	window-width
	window-hscroll
	set-window-hscroll
	window-edges
	window-point
	window-start
	set-window-point
	set-window-start
	delete-window
	next-window
	previous-window
	other-window
	get-lru-window
	get-largest-window
	get-buffer-window
	delete-other-windows
	delete-windows-on
	replace-buffer-in-windows
	show-buffer
	selected-window
	select-window
	display-buffer
	split-window
	enlarge-window
	shrink-window

	split-window-vertically
	split-window-horizontally
	enlarge-window-horizontally
	shrink-window-horizontally


	scroll-up
	scroll-down
	scroll-left
	scroll-right
	scroll-other-window
	recenter
	move-to-window-line
	save-window-excursion

	redraw-display

	set-screen-height
	set-screen-width
	screen-height
	screen-width


	Variables
	no-redraw-on-recenter
	scroll-step
	debug-end-pos
	truncate-partial-width-windows
	mode-line-inverse-video
	global-mode-string


	ctl-x-4-map
	pop-up-windows
	next-screen-context-lines
	split-height-threshold
	window-min-height
	window-min-width

Processes
	processp
	get-process
	get-buffer-process
	delete-process
	process-status
	process-exit-status
	process-id
	process-name
	process-command
	set-process-buffer
	process-buffer
	process-mark
	set-process-filter
	process-filter
	set-process-sentinel
	process-sentinel
	process-kill-without-query
	list-processes
	start-process
	accept-process-output

	waiting-for-user-input-p
	process-send-region
	process-send-string
	interrupt-process
	kill-process
	quit-process
	stop-process
	continue-process
	process-send-eof
	call-process
	call-process-region

	shell-command
	shell-command-on-region

	Variables
	delete-exited-processes
	process-connection-type

	exec-path
	exec-directory
	process-environment
	compile-command



Operating system interface
	getenv
	load-average
	user-login-name
	user-real-login-name
	user-full-name
	system-name
	current-time-string
	display-time

	pwd
	cd
		
	kill-emacs
	dump-emacs
	suspend-emacs


	compile
	grep
	shell
	shell-command
	shell-command-on-region

	rnews
	rmail
	mail

	Variables
	command-line-args
	system-type
	non-interactive

	shell-file-name
	shell-prompt-pattern
	display-time-day-and-date

	command-line-processed
	inhibit-startup-message
	inhibit-default-init


Permutted Command Index
Subject Index
================
Dave Duff (duffd@ge-crd.ARPA)
General Electric Corporate Research and Development
Schenectady, New York

alex@umbc3.UUCP (10/01/87)

In article <527@home.CSNET> ekberg@home.CSNET (Tom Ekberg) writes:
>Does anyone out there know of a programmers guide for gnuemacs?  After
>reviewing some of the source files I can do some minimal coding (being
>proficient in Common Lisp helps) but there are some things that would be
>difficult to know by just reading the code.  Even a summary of all of the forms
>would help (yes, I have looked at the documentation string but even that isn't
>enough).  Well, how about it?
>
>-- 
>  -- tom (aisle C-4L), EKBERG%TI-CSL@CSNET-RELAY

pauls@inco.UUCP (Paul Stygar) (10/01/87)

> Does anyone out there know of a programmers guide for gnuemacs?  After
> reviewing some of the source files I can do some minimal coding (being
> proficient in Common Lisp helps) but there are some things that would be
> difficult to know by just reading the code.  Even a summary of all of the
> forms would help (yes, I have looked at the documentation string but even
> that isn't enough).  Well, how about it?

Have you looked at the file /usr/local/emacs/etc/DOC ?  It has over 200KB.
Apparently it is what is used by the C-h f (describe-function) and the 
C-h v (describe-variable),  so it's relatively complete.
It's fairly close to a "summary of all the forms". 

Some cut&paste would be needed to put DOC into a outline suitable for
a programmer's manual.  About 80% of the material is organized: ie.,
logically related items often appear in sequence.  For example, to find
all the info on "mark",  there is no index,  so one does string searches,
and there are several clusters of info on "mark" scattered throughout.
Think of it as a gold mine.  Emacs provides all the tools needed to search
and retrieve the various treasures and potions et al.

The files TO_DO and TO-DO have RMS's wish list for GnuEmacs,  and LISP
Manual is definitely on the wish list.

Since DOC uses ^_F and ^_V to indicate the beginning of a describe-function
and a describe-variable entry respectively,  it was a useful exercise to
write some Gnu Lisp code to scan DOC and insert CR CR TAB in place of each
entry and wrap parentheses around each function:

(defun undoc () " Reformat DOC into a Forms Summary:
	Convert ^_Fstring to CR CR TAB (string) CR
	Convert ^_Vstring to CR CR TAB string CR "
 (while (not (eobp))
  (cond ((= (following-char) ?\C-_ )  
         (delete-char 1)
         (newline 2)
         (insert ?\t) 
         (cond ((= (following-char) ?V)
		(delete-char 1)
		(end-of-line))
               ((= (following-char) ?F)
		(delete-char 1)
                (insert ?( )
                (end-of-line)
                (insert ?) )))
         (newline)))
  (forward-char)))

To try this code,  put "undoc" in a file "undoc.el" in your work directory,
copy DOC to your directory, add the following to .emacs in your home
directory:

     (setq load-path (cons "/your-work-pwd" load-path))

Then just do "emacs DOC", M-ESC (load "undoc"), M-ESC (undoc) and wait ...
You can C-G to stop (undoc) at any point,  then just M-ESC (undoc) to resume.

The result:  a do-it-yourself Forms Summary.    Enjoy!


-- 
 |~	\^/		 |~		    |~
o|     /O.o\	 |~	o|	  |~	   o|		    Paul Stygar**
	( )	o|		 o|			 (703) 442-7960**
	_!_			     ...!seismo!sundc!hadron!inco!pauls**
**McDonnell Douglas-Inco, Inc., 8201 Greensboro Drive, McLean, VA 22102**
**BEGIN*DISCLAIMER;*****The*views*expressed*above*in*no*way*reflect*the**
**views*of*McDonnell*Douglas*or*its*subsidiaries.*******END*DISCLAIMER;**

root@yale.UUCP (Celray Stalk) (10/02/87)

In article <527@home.CSNET> ekberg@home.CSNET (Tom Ekberg) writes:
>Does anyone out there know of a programmers guide for gnuemacs?

About a year ago, Robert Krawitz posted a chapter he wrote for the
not-yet-existent GNU Emacs Programmer's manual, called Lisp Functions and
Emacs Commands.  It describes Emacs Lisp, the "interactive" function, writing
commands in C, and so on.  I find it extremely useful.

I can e-mail it to you if you want it.  Since it is a little long and has
already been posted, I'd rather not post it again.

-- Ashwin Ram --

ARPA:    Ram-Ashwin@cs.yale.edu
UUCP:    {decvax,linus,seismo}!yale!Ram-Ashwin
BITNET:  Ram@yalecs