[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Problem compiling flavors in Opus 83.79



A very quick check reveals the following suspiciousness:  The function
in flavors.l being compiled when the failure occurs is apparently:

(DEFUN (FLAVOR :NAMED-STRUCTURE-INVOKE) (OPERATION &OPTIONAL SELF &REST ARGS)
  (SELECTQ OPERATION
	   (:WHICH-OPERATIONS '(:PRINT-SELF :DESCRIBE))
	   (:PRINT-SELF
	    (SI:PRINTING-RANDOM-OBJECT (SELF (CAR ARGS))
	       (FORMAT (CAR ARGS) "FLAVOR ~S" (FLAVOR-NAME SELF))))
	   (:DESCRIBE (DESCRIBE-FLAVOR SELF))
	   (OTHERWISE
	    (FERROR NIL "~S UNKNOWN OPERATION FOR FLAVOR" OPERATION))))

This is the first appearance in the file of defun with a "function
spec" instead of a symbol as the first argument.  This is a Lisp
Machine hack which basically means to squirrel the functional object
away under the :NAMED-STRUCTURE-INVOKE property of the plist of FLAVOR.
(More precisely, the first arg is the Maclisp compatability syntax for
(:PROPERTY FLAVOR :NAMED-STRUCTURE-INVOKE) ...)

Liszt could be choking as it tries to store into the
function-definition slot of something other than a symbol.  Such
abilities of defun are not documented in Franz, and it might be that
your defun macro in common0.l has not been extended for such usage.
Locally it is defined as follows:

;--- defun
; maclisp style function defintion
;
(def defun
   (macro (l)
      (prog (name type arglist body specind specnam)
	 (setq name (cadr l) l (cddr l))
	 (cond ((dtpr name)
		(cond ((memq (cadr name) '(macro expr fexpr lexpr))
		       (setq l (cons (cadr name) l)
			     name (car name)))
		      (t (setq specnam (car name)
			       specind (cadr name)
			       name (concat (gensym) "::" specnam))))))
	 (cond ((null (car l)) (setq type 'lambda))
	       ((eq 'fexpr (car l)) (setq type 'nlambda l (cdr l)))
	       ((eq 'expr (car l))  (setq type 'lambda l (cdr l)))
	       ((eq 'macro (car l)) (setq type 'macro l (cdr l)))
	       ((atom (car l))
		(setq type 'lexpr
		      l (nconc (list (list (car l)))
			       (cdr l))))
	       (t (setq type 'lambda)))
	 (setq body (list 'def name (cons type l)))
	 (cond (specnam
		  (return (list 'progn ''compile
				body
				(list 'putprop
				      (list 'quote specnam)
				      (list 'getd
					    (list 'quote name))
				      (list 'quote specind)))))
	       (t (return body))))))

You could also check by invoking liszt without arguments and then
asking it
	(testmac '(defun (foo bar) () (hello goodbye)))
and seeing if it properly generates
	(progn 'compile (defun ... ) (putprop ... ))

On another matter, I have recently been making a number of minor
bugfixes to the flavor and various other MIT compatibility packages.
These files come indirecly from Maclisp or Lisp Machines, and the ports
have generally never been exercised sufficiently to check all the
obscure features.  These fixes postdate the versions Rich Zippel
recently transmitted to Berkeley.  I will shortly distribute the
new versions to Berkeley.

Believe it or not, the flavor system really does work under Franz.
So do hash tables, defstruct, format, etc.  I use them every day.

Steve Haflich, MIT Experimental Music Studio
smh@mit-ems@mit-mc
{decvax!genrad, ihnp4}!mit-eddie!smh