8
8
;;; (c) Copyright 1980 Massachusetts Institute of Technology ;;;
9
9
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
12
12
(macsyma-module transs)
14
(defun set-up-translate ()
15
(load '|<macsym>transl.autolo|)
16
(load '|<macsym>trdata.fasl|)
17
(load '|<maxout>dcl.fasl|)
18
(load '|<macsym>transl.fasl|)
19
(load '|<macsym>trans1.fasl|)
20
(load '|<macsym>troper.fasl|)
21
(load '|<macsym>trutil.fasl|)
22
(load '|<macsym>trans2.fasl|))
24
(TRANSL-MODULE TRANSS)
27
(DEFMVAR *TRANSL-FILE-DEBUG* NIL
28
"set this to T if you don't want to have the temporary files
14
;;(defun set-up-translate ()
15
;; (load '|<macsym>transl.autolo|)
16
;; (load '|<macsym>trdata.fasl|)
17
;; (load '|<maxout>dcl.fasl|)
18
;; (load '|<macsym>transl.fasl|)
19
;; (load '|<macsym>trans1.fasl|)
20
;; (load '|<macsym>troper.fasl|)
21
;; (load '|<macsym>trutil.fasl|)
22
;; (load '|<macsym>trans2.fasl|))
24
(transl-module transs)
27
(defmvar *transl-file-debug* nil
28
"set this to T if you don't want to have the temporary files
29
29
used automaticaly deleted in case of errors.")
31
31
;;; User-hacking code, file-io, translator toplevel.
32
32
;;; There are various macros to cons-up filename TEMPLATES
33
;;; which to mergef into. The filenames are should be the only
33
;;; which to mergef into. The filenames should be the only
34
34
;;; system dependant part of the code, although certain behavior
35
;;; of RENAMEF/MERGEF/DELETEF is assumed.
35
;;; of RENAMEF/MERGEF/DELETE-FILE is assumed.
37
(defmvar $TR_OUTPUT_FILE_DEFAULT '$TRLISP
38
"This is the second file name to be used for translated lisp
37
(defmvar $tr_output_file_default '$trlisp
38
"This is the second file name to be used for translated lisp
41
(DEFMVAR $TR_FILE_TTY_MESSAGESP nil
42
"It TRUE messages about translation of the file are sent
41
(defmvar $tr_file_tty_messagesp nil
42
"It TRUE messages about translation of the file are sent
46
"Generate helpful comments and programming hints.")
48
(DEFTRVAR *TRANSLATION-MSGS-FILES* NIL
49
"Where the warning and other comments goes.")
51
(DEFTRVAR $TR_VERSION (GET 'TRANSL-AUTOLOAD 'VERSION))
53
(DEFMVAR TRANSL-FILE NIL "output stream of $COMPFILE and $TRANSLATE_FILE")
55
(DEFMVAR $COMPGRIND NIL "If TRUE lisp output will be pretty-printed.")
57
(DEFMVAR $TR_TRUE_NAME_OF_FILE_BEING_TRANSLATED nil
58
"This is set by TRANSLATE_FILE for use by user macros
46
"Generate helpful comments and programming hints.")
48
(deftrvar *translation-msgs-files* nil
49
"Where the warning and other comments goes.")
51
(deftrvar $tr_version (get 'transl-autoload 'version))
53
(defmvar transl-file nil "output stream of $compfile and $translate_file")
55
(defmvar $compgrind nil "If `true' lisp output will be pretty-printed.")
57
(defmvar $tr_true_name_of_file_being_translated nil
58
"This is set by TRANSLATE_FILE for use by user macros
59
59
which want to know the name of the source file.")
61
(DEFMVAR $TR_STATE_VARS
62
'((MLIST) $TRANSCOMPILE $TR_SEMICOMPILE
64
$TRANSLATE_FAST_ARRAYS
69
$TR_WARN_UNDEFINED_VARIABLE
70
$TR_FUNCTION_CALL_DEFAULT
61
(defmvar $tr_state_vars
62
'((mlist) $transcompile $tr_semicompile
63
$translate_fast_arrays
68
$tr_warn_undefined_variable
69
$tr_function_call_default
75
74
(defmacro compfile-outputname-temp ()
76
; #-(or Multics Cl) ''|_CMF_ OUTPUT|
77
#+Multics ''(f* _cmf_ output)
78
#+cl '`,(pathname "_cmf_"))
75
'`,(pathname "_cmf_"))
80
77
(defmacro compfile-outputname ()
81
#-(or Multics Cl)'`((DSK ,(STATUS UDIR))
83
,(stripdollar $TR_OUTPUT_FILE_DEFAULT))
84
#+Multics '`(,(status udir) ,(stripdollar $tr_output_file_default))
85
#+cl '`,(pathname (stripdollar $tr_output_file_default)))
78
'`,(pathname (stripdollar $tr_output_file_default)))
87
(defmacro trlisp-inputname-d1 ()
88
;; so hacks on DEFAULTF will not stray the target.
89
#-(or Multics Cl) '`((dsk ,(status udir)) * >)
90
#+Multics '`(,(status udir) * *)
91
#+cl '`,(pathname ""))
80
(defmacro trlisp-inputname-d1 () ;; so hacks on DEFAULTF will not
81
'`,(pathname "")) ;; stray the target.
93
83
(defmacro trlisp-outputname-d1 ()
94
#-(or Multics Cl) '`((* *) * ,(stripdollar $TR_OUTPUT_FILE_DEFAULT))
95
#+Multics '`(* * ,(stripdollar $tr_output_file_default))
96
#+cl '`,(pathname (stripdollar $tr_output_file_default)))
84
'`,(pathname (stripdollar $tr_output_file_default)))
98
86
(defmacro trlisp-outputname ()
99
; #-(or Multics Cl) ''|* TRLISP|
100
#+Multics ''(* * lisp)
101
#+cl '`,(make-pathname :type "LISP"))
87
'`,(make-pathname :type "LISP"))
103
89
(defmacro trlisp-outputname-temp ()
104
; #-(or Multics Cl) ''|* _TRLI_|
105
#+Multics ''(* * _trli_)
106
#+cl '`,(pathname "_trli_"))
90
'`,(pathname "_trli_"))
108
92
(defmacro trtags-outputname ()
109
; #-(or Multics Cl) ''|* TAGS|
110
#+Multics ''(* * tags)
111
#+cl '`,(pathname "tags"))
113
95
(defmacro trtags-outputname-temp ()
114
; #-(or Multics Cl) ''|* _TAGS_|
115
#+Multics ''(* * _tags_)
116
#+cl '`,(pathname "_tags_"))
96
'`,(pathname "_tags_"))
119
98
(defmacro trcomments-outputname ()
120
; #-(or Multics Cl) ''|* UNLISP|
121
#+Multics ''(* * unlisp)
122
#+cl '`,(pathname "unlisp"))
99
'`,(pathname "unlisp"))
124
101
(defmacro trcomments-outputname-temp ()
125
; #-(or Multics Cl) ''|* _UNLI_|
126
#+Multics ''(* * _unli_)
127
#+cl '`,(pathname "_unli_"))
129
(DEFTRVAR DECLARES NIL)
102
'`,(pathname "_unli_"))
104
(deftrvar declares nil)
130
106
;;;these first five functions have been altered to run on
131
107
;;;the 3600 we must try to fix translate-file wfs fixed -wfs
133
(defmacro mytruename (x) `(truename ,x))
137
109
(defun rename-tf (new-name true-in-file-name &optional newname)
138
true-in-file-name new-name
110
true-in-file-name new-name
141
113
(setq in-file (truename transl-file))
142
114
(close transl-file)
143
(setq newname (sub-seq (string newname) 1))
115
(setq newname (maxima-string newname))
144
116
(rename-file in-file newname))))
148
(DEFMSPEC $COMPFILE (FORMS)
118
(defmspec $compfile (forms)
149
119
(let (( newname (second forms)))
150
(setq forms (cdr forms))
152
(SETQ $TRANSCOMPILE T
154
(let ((OUT-FILE-NAME (COND ((MFILENAME-ONLYP (CAR FORMS))
155
($FILENAME_MERGE (POP FORMS)))
158
(*TRANSLATION-MSGS-FILES* NIL))
160
(MERGEF OUT-FILE-NAME (COMPFILE-OUTPUTNAME)))
163
(SETQ TRANSL-FILE (OPEN-out-dsk (MERGEF (COMPFILE-OUTPUTNAME-TEMP)
166
(COND ((OR (MEMQ '$ALL FORMS) (MEMQ '$FUNCTIONS FORMS))
167
(SETQ FORMS (MAPCAR #'CAAR (CDR $FUNCTIONS)))))
168
(DO ((L FORMS (CDR L))
171
(ITEM) (LEXPRS NIL NIL) (FEXPRS NIL NIL)
175
(COND ((NOT (ATOM ITEM))
176
(PRINT* (DCONVX (TRANSLATE ITEM))))
180
(SETQ ITEM ($VERBIFY ITEM))))
183
(PRINT-ABORT-MSG ITEM
188
"~2%;; Function ~:@M~%" ITEM)))
190
(setq out-file-name (RENAME-TF OUT-FILE-NAME NIL newname))
191
(TO-MACSYMA-NAMESTRING OUT-FILE-NAME))
193
(IF TRANSL-FILE (CLOSE TRANSL-FILE))
194
(IF T-ERROR (DELETEF TRANSL-FILE)))))))
197
(DEFMSPEC $COMPFILE (FORMS) (setq forms (cdr forms))
199
(SETQ $TRANSCOMPILE T
201
(let ((OUT-FILE-NAME (COND ((MFILENAME-ONLYP (CAR FORMS))
202
($FILENAME_MERGE (POP FORMS)))
205
(*TRANSLATION-MSGS-FILES* NIL))
207
(MERGEF OUT-FILE-NAME (COMPFILE-OUTPUTNAME)))
210
(SETQ TRANSL-FILE (OPEN-out-dsk (MERGEF (COMPFILE-OUTPUTNAME-TEMP)
213
(COND ((OR (MEMQ '$ALL FORMS) (MEMQ '$FUNCTIONS FORMS))
214
(SETQ FORMS (MAPCAR #'CAAR (CDR $FUNCTIONS)))))
215
(DO ((L FORMS (CDR L))
218
(ITEM) (LEXPRS NIL NIL) (FEXPRS NIL NIL)
222
(COND ((NOT (ATOM ITEM))
223
(PRINT* (DCONVX (TRANSLATE ITEM))))
227
(SETQ ITEM ($VERBIFY ITEM))))
230
(PRINT-ABORT-MSG ITEM
235
"~2%;; Function ~:@M~%" ITEM)))
237
(RENAME-TF OUT-FILE-NAME NIL)
238
(TO-MACSYMA-NAMESTRING OUT-FILE-NAME))
240
(IF TRANSL-FILE (CLOSE TRANSL-FILE))
241
(IF T-ERROR (DELETEF TRANSL-FILE))))))
244
(DEFUN COMPILE-FUNCTION (F)
245
(MFORMAT *TRANSLATION-MSGS-FILES*
246
"~%Translating ~:@M" F)
247
(LET ((FUN (TR-MFUN F)))
251
(DEFVAR TR-DEFAULTF NIL
252
"A default only for the case of NO arguments to $TRANSLATE_FILE")
120
(setq forms (cdr forms))
122
(setq $transcompile t
124
(let ((out-file-name (cond ((mfilename-onlyp (car forms))
125
($filename_merge (pop forms)))
128
(*translation-msgs-files* nil))
130
(mergef out-file-name (compfile-outputname)))
133
(setq transl-file (open-out-dsk (mergef (compfile-outputname-temp)
136
(cond ((or (memq '$all forms) (memq '$functions forms))
137
(setq forms (mapcar #'caar (cdr $functions)))))
138
(do ((l forms (cdr l))
141
(item) (lexprs nil nil) (fexprs nil nil)
145
(cond ((not (atom item))
146
(print* (dconvx (translate item))))
150
(setq item ($verbify item))))
153
(print-abort-msg item
158
"~2%;; Function ~:@M~%" item)))
160
(setq out-file-name (rename-tf out-file-name nil newname))
161
(to-macsyma-namestring out-file-name))
163
(if transl-file (close transl-file))
164
(if t-error (delete-file transl-file)))))))
167
;;(DEFMSPEC $COMPFILE (FORMS) (setq forms (cdr forms))
168
;; (bind-transl-state
169
;; (SETQ $TRANSCOMPILE T
171
;; (let ((OUT-FILE-NAME (COND ((MFILENAME-ONLYP (CAR FORMS))
172
;; ($FILENAME_MERGE (POP FORMS)))
175
;; (*TRANSLATION-MSGS-FILES* NIL))
176
;; (SETQ OUT-FILE-NAME
177
;; (MERGEF OUT-FILE-NAME (COMPFILE-OUTPUTNAME)))
180
;; (SETQ TRANSL-FILE (OPEN-out-dsk (MERGEF (COMPFILE-OUTPUTNAME-TEMP)
183
;; (COND ((OR (MEMQ '$ALL FORMS) (MEMQ '$FUNCTIONS FORMS))
184
;; (SETQ FORMS (MAPCAR #'CAAR (CDR $FUNCTIONS)))))
185
;; (DO ((L FORMS (CDR L))
186
;; (DECLARES NIL NIL)
187
;; (TR-ABORT NIL NIL)
188
;; (ITEM) (LEXPRS NIL NIL) (FEXPRS NIL NIL)
191
;; (SETQ ITEM (CAR L))
192
;; (COND ((NOT (ATOM ITEM))
193
;; (PRINT* (DCONVX (TRANSLATE ITEM))))
197
;; (SETQ ITEM ($VERBIFY ITEM))))
200
;; (PRINT-ABORT-MSG ITEM
204
;; (MFORMAT TRANSL-FILE
205
;; "~2%;; Function ~:@M~%" ITEM)))
206
;; (PRINT* T-ITEM))))))
207
;; (RENAME-TF OUT-FILE-NAME NIL)
208
;; (TO-MACSYMA-NAMESTRING OUT-FILE-NAME))
209
;; ;; unwind-protected
210
;; (IF TRANSL-FILE (CLOSE TRANSL-FILE))
211
;; (IF T-ERROR (DELETE-FILE TRANSL-FILE))))))
214
(defun compile-function (f)
215
(mformat *translation-msgs-files*
216
"~%Translating ~:@M" f)
217
(let ((fun (tr-mfun f)))
221
(defvar tr-defaultf nil
222
"A default only for the case of no arguments to $translate_file")
254
224
;;; Temporary hack during debugging of this code.
258
(defun mergef (x y) (fs:merge-pathnames y x))
260
(defun mergef (x y) (merge-pathnames y x))
262
(defmacro truename (x) `(send ,x ':truename)))
227
(defun mergef (x y) (merge-pathnames y x)))
264
229
(defun $compile_file (input-file
265
230
&optional bin-file translation-output-file &aux result )
271
236
(setq result (list '(mlist) input-file)))
272
237
(t (setq result (translate-file input-file translation-output-file))
273
238
(setq input-file (third result))))
274
#+(or cmu sbcl clisp allegro openmcl)
239
#+(or cmu scl sbcl clisp allegro openmcl)
275
240
(multiple-value-bind (output-truename warnings-p failure-p)
277
242
(compile-file input-file :output-file bin-file)
278
243
(compile-file input-file))
244
(declare (ignore warnings-p))
279
245
;; If the compiler encountered errors, don't set bin-file to
280
246
;; indicate that we found errors. Is this what we want?
281
247
(unless failure-p
282
248
(setq bin-file output-truename)))
283
#-(or cmu sbcl clisp allegro openmcl)
249
#-(or cmu scl sbcl clisp allegro openmcl)
284
250
(setq bin-file (compile-file input-file :output-file bin-file))
285
251
(append result (list bin-file)))
288
(DEFMFUN $TRANSLATE_FILE (&OPTIONAL (INPUT-FILE-NAME NIL I-P)
289
(OUTPUT-FILE-NAME NIL O-P))
291
(progn (cond ((atom input-file-name)
292
(setq input-file-name
293
(string-trim "&" input-file-name)))))
295
(MERROR "Arguments are input file and optional output file~
296
~%which defaults to second name LISP, msgs are put~
297
~%in file with second file name UNLISP"))
299
#+cl(SETQ INPUT-FILE-NAME
303
(SETQ INPUT-FILE-NAME (MERGEF ($FILENAME_MERGE INPUT-FILE-NAME)
304
(trlisp-inputname-d1)))
305
(SETQ TR-DEFAULTF INPUT-FILE-NAME))
307
(SETQ TR-DEFAULTF INPUT-FILE-NAME)))
309
(SETQ OUTPUT-FILE-NAME
310
(progn (setq output-file-name
312
(if o-p output-file-name input-file-name)))
313
(send output-file-name :new-type :lisp)))
315
(SETQ OUTPUT-FILE-NAME
317
(MERGEF ($FILENAME_MERGE OUTPUT-FILE-NAME) INPUT-FILE-NAME)
318
(MERGEF (TRLISP-OUTPUTNAME-D1) INPUT-FILE-NAME)))
319
(TRANSLATE-FILE INPUT-FILE-NAME
321
$TR_FILE_TTY_MESSAGESP ))
254
;;(DEFMFUN $TRANSLATE_FILE (&OPTIONAL (INPUT-FILE-NAME NIL I-P)
255
;; (OUTPUT-FILE-NAME NIL O-P))
257
;; (progn (cond ((atom input-file-name)
258
;; (setq input-file-name
259
;; (string-trim "&" input-file-name)))))
260
;; (OR I-P TR-DEFAULTF
261
;; (MERROR "Arguments are input file and optional output file~
262
;; ~%which defaults to second name LISP, msgs are put~
263
;; ~%in file with second file name UNLISP"))
265
;; #+cl(SETQ INPUT-FILE-NAME
269
;; (SETQ INPUT-FILE-NAME (MERGEF ($FILENAME_MERGE INPUT-FILE-NAME)
270
;; (trlisp-inputname-d1)))
271
;; (SETQ TR-DEFAULTF INPUT-FILE-NAME))
273
;; (SETQ TR-DEFAULTF INPUT-FILE-NAME)))
275
;; (SETQ OUTPUT-FILE-NAME
276
;; (progn (setq output-file-name
278
;; (if o-p output-file-name input-file-name)))
279
;; (send output-file-name :new-type :lisp)))
281
;; (SETQ OUTPUT-FILE-NAME
283
;; (MERGEF ($FILENAME_MERGE OUTPUT-FILE-NAME) INPUT-FILE-NAME)
284
;; (MERGEF (TRLISP-OUTPUTNAME-D1) INPUT-FILE-NAME)))
285
;; (TRANSLATE-FILE INPUT-FILE-NAME
287
;; $TR_FILE_TTY_MESSAGESP ))
289
;; Converts a Maxima "string" (which is really a symbol that starts
290
;; with the character '&') to a Lisp string.
324
291
(defun maxima-string (symb)
325
(string-left-trim "&" (string symb)))
292
(string-left-trim "&" (print-invert-case symb)))
328
294
(defmfun $translate_file (input-file &optional output-file)
329
(setq input-file (maxima-string input-file))
330
(cond (output-file (setq output-file (maxima-string output-file))))
331
(translate-file input-file output-file))
295
(setq input-file (maxima-string input-file))
296
(cond (output-file (setq output-file (maxima-string output-file))))
297
(translate-file input-file output-file))
333
(DEFMVAR $TR_GEN_TAGS NIL
334
"If TRUE, TRANSLATE_FILE generates a TAGS file for
299
(defmvar $tr_gen_tags nil
300
"If TRUE, TRANSLATE_FILE generates a TAGS file for
335
301
use by the text editor")
337
303
(defvar *pretty-print-translation* t)
305
;; Define a pprinter for defmtrfun.
308
(defun pprint-defmtrfun (stream s)
309
(pprint-logical-block (stream s :prefix "(" :suffix ")")
310
(write (pprint-pop) :stream stream)
311
(write-char #\space stream)
312
(write (pprint-pop) :stream stream)
313
(pprint-indent :block 4 stream)
314
(pprint-newline :mandatory stream)
315
(write (pprint-pop) :stream stream)
316
(pprint-indent :block 2 stream)
317
(pprint-newline :mandatory stream)
319
(pprint-exit-if-list-exhausted)
320
(write (pprint-pop) :stream stream)
321
(write-char #\space stream)
322
(pprint-newline :linear stream))))
339
324
(defun call-batch1 (in-stream out-stream &aux expr transl)
341
326
;; we want the thing to start with a newline..
342
327
(newline in-stream #\n)
343
(sloop while (and (setq expr (mread in-stream))
345
do (setq transl (translate-macexpr-toplevel (third expr)))
346
(cond (*pretty-print-translation* (pprint transl out-stream))
348
(format out-stream "~A" transl)))))
328
(let ((*readtable* (copy-readtable nil))
330
(*print-pprint-dispatch* (copy-pprint-dispatch)))
334
(setf (readtable-case *readtable*) :invert)
336
(unless #+scl (eq ext:*case-mode* :lower)
337
#+allegro (eq excl:*current-case-mode* :case-sensitive-lower)
338
(setf (readtable-case *readtable*) :invert))
339
(set-pprint-dispatch '(cons (member maxima::defmtrfun))
341
(loop while (and (setq expr (mread in-stream)) (consp expr))
342
do (setq transl (translate-macexpr-toplevel (third expr)))
344
(*pretty-print-translation*
345
(pprint transl out-stream))
347
(format out-stream "~a" transl))))))
351
350
(defun translate-from-stream (from-stream &key to-stream eval pretty (print-function #'prin1) &aux expr transl )
352
351
(bind-transl-state
353
(sloop while (and (setq expr (mread from-stream)) (consp expr))
354
with *in-translate-file* = t
355
with *print-pretty* = pretty
356
do (setq transl (translate-macexpr-toplevel (third expr)))
357
;(show transl forms-to-compile-queue)
358
(cond (eval (eval transl)))
359
(cond (to-stream (funcall print-function transl to-stream)))
360
(sloop for v in forms-to-compile-queue
361
do (show v to-stream)
363
do (funcall print-function v to-stream)
367
(setq forms-to-compile-queue nil))))
369
(DEFVAR TRF-START-HOOK NIL)
372
(DEFUN DELETE-OLD-AND-OPEN (X)
373
(open x :direction :output))
375
(DEFUN DELETE-OLD-AND-OPEN (X)
376
(IF (LET ((F (PROBE-FILE X)))
377
(AND F (NOT (MEMQ (CADDR (NAMELIST F)) '(< >)))))
352
(loop while (and (setq expr (mread from-stream)) (consp expr))
353
with *in-translate-file* = t
354
with *print-pretty* = pretty
355
do (setq transl (translate-macexpr-toplevel (third expr)))
356
;(show transl forms-to-compile-queue)
357
(cond (eval (eval transl)))
358
(cond (to-stream (funcall print-function transl to-stream)))
359
(loop for v in forms-to-compile-queue
360
do (show v to-stream)
362
do (funcall print-function v to-stream)
366
(setq forms-to-compile-queue nil))))
368
(defvar trf-start-hook nil)
370
(defun delete-old-and-open (x)
371
(open x :direction :output))
374
;;(DEFUN DELETE-OLD-AND-OPEN (X)
375
;; (IF (LET ((F (PROBE-FILE X)))
376
;; (AND F (NOT (MEMQ (CADDR (NAMELIST F)) '(< >)))))
382
380
(defun alter-pathname (pathname &rest options)
383
(apply 'make-pathname :defaults (pathname pathname) options))
381
(apply 'make-pathname :defaults (pathname pathname) options))
385
383
(defun delete-with-side-effects-if (test list)
386
(declare (function test))
387
384
"Rudimentary DELETE-IF which, however, is guaranteed to call
388
385
the function TEST exactly once for each element of LIST, from
391
while (and list (funcall test (car list)))
388
while (and list (funcall test (car list)))
396
if (funcall test (cadr list))
393
if (funcall test (cadr list))
402
399
(defun insert-necessary-function-declares (stream)
436
433
(format stream "$ */"))
437
434
(fresh-line stream)
438
435
(when (or hint *untranslated-functions-called*)
439
(format t "~&See the UNLISP file for possible optimizations."))))
443
(DEFUN TRANSLATE-FILE (IN-FILE-NAME OUT-FILE-NAME
445
(TTYMSGSP $TR_FILE_TTY_MESSAGESP) &aux warn-file
447
*translation-msgs-files* *untranslated-functions-called* *declared-translated-functions*)
449
(SETQ *IN-TRANSLATE-FILE* T)
450
(setq translated-file (alter-pathname (or out-file-name in-file-name) :type "LISP"))
451
(setq warn-file (alter-pathname in-file-name :type "UNLISP"))
452
(with-open-file (in-stream in-file-name)
453
(with-open-file (out-stream translated-file :direction :output
454
:if-exists :supersede)
455
(with-open-file (warn-stream warn-file :direction :output
456
:if-exists :supersede)
457
(setq *translation-msgs-files* (list warn-stream))
459
(SETQ *TRANSLATION-MSGS-FILES*
460
(CONS *standard-output* *TRANSLATION-MSGS-FILES*)))
462
";;; -*- Mode: Lisp; package:maxima; syntax:common-lisp ;Base: 10 -*- ;;;~%")
464
(format out-stream ";;;Translated on: ~A"
465
(time:print-current-time nil))
468
";;Maxima System version ~A"
469
(or (si:get-system-version 'maxima)
470
(si:get-system-version 'cl-maxima)))
471
#+cl (format out-stream "~%(in-package \"MAXIMA\")")
472
(format warn-stream "~%This is the unlisp file for ~A "
473
(namestring (pathname in-stream)))
475
"~%;;** Variable settings were **~%~%")
476
(sloop for v in (cdr $tr_state_vars)
477
do (mformat out-stream ";;~:M:~:M;~%" v (symbol-value v)))
478
(MFORMAT *terminal-io* "~%Translation begun on ~A.~%"
479
(pathname in-stream))
480
(CALL-BATCH1 in-stream out-stream)
481
(insert-necessary-function-declares warn-stream)
482
;; BATCH1 calls TRANSLATE-MACEXPR-toplevel on each expression read.
486
(list in-stream out-stream warn-stream)))))))))
490
(DEFUN TRANSLATE-FILE (IN-FILE-NAME OUT-FILE-NAME TTYMSGSP)
492
(SETQ *IN-TRANSLATE-FILE* T)
494
(*TRANSLATION-MSGS-FILES*)
497
(TAGS-OUTPUT-STREAM-STATE)
502
(SETQ IN-FILE (OPEN IN-FILE-NAME)
503
TRUE-IN-FILE-NAME (TO-MACSYMA-NAMESTRING (TRUENAME IN-FILE))
504
$TR_TRUE_NAME_OF_FILE_BEING_TRANSLATED TRUE-IN-FILE-NAME
505
TRANSL-FILE (DELETE-OLD-AND-OPEN
506
(MERGEF (trlisp-outputname-temp)
508
DSK-MSGS-FILE (DELETE-OLD-AND-OPEN
510
(merge-pathnames out-file-name
511
(make-pathname :type "unlisp"))
512
#-cl(MERGEF (trcomments-outputname-temp)
515
*TRANSLATION-MSGS-FILES* (LIST DSK-MSGS-FILE))
517
(SETQ TAGS-OUTPUT-STREAM
518
(OPEN-out-dsk (MERGEF (trtags-outputname-temp)
521
(SETQ *TRANSLATION-MSGS-FILES*
522
(CONS #-cl TYO #+cl *standard-output* *TRANSLATION-MSGS-FILES*)))
523
#-cl(PROGN(CLOSE IN-FILE)
524
;; IN-FILE stream of no use with old-io BATCH1.
526
(MFORMAT DSK-MSGS-FILE "~%This is the UNLISP file for ~A.~%"
528
(MFORMAT *terminal-io* "~%Translation begun on ~A.~%"
530
(IF TRF-START-HOOK (FUNCALL TRF-START-HOOK TRUE-IN-FILE-NAME))
532
(IF TAGS-OUTPUT-STREAM (TAGS-START//END IN-FILE-NAME))
533
(CALL-BATCH1 in-file transl-file)
534
;; BATCH1 calls TRANSLATE-MACEXPR on each expression read.
535
(MFORMAT DSK-MSGS-FILE
536
"~%//* Variable settings were *//~%~%")
537
(DO ((L (CDR $TR_STATE_VARS) (CDR L)))
539
(MFORMAT-OPEN DSK-MSGS-FILE
541
(CAR L) (SYMBOL-VALUE (CAR L))))
542
#-cl(RENAME-TF OUT-FILE-NAME TRUE-IN-FILE-NAME)
543
#-cl (WHEN TAGS-OUTPUT-STREAM
545
;;(CLOSE TAGS-OUTPUT-STREAM)
546
(RENAMEF TAGS-OUTPUT-STREAM (trtags-outputname)))
547
;;(CLOSE DSK-MSGS-FILE)
548
;; The CLOSE before RENAMEF clobbers the old temp file.
549
;; nope. you get a FILE-ALREADY-EXISTS error. darn.
550
(let ((tr-comment-file-name (mergef (trcomments-outputname)
552
#-cl (if (probe-file tr-comment-file-name)
553
(deletef tr-comment-file-name))
554
#-cl (RENAMEF DSK-MSGS-FILE tr-comment-file-name)
556
#-cl`((MLIST) ,(TO-MACSYMA-NAMESTRING TRUE-IN-FILE-NAME)
557
,(TO-MACSYMA-NAMESTRING OUT-FILE-NAME)
558
,(TO-MACSYMA-NAMESTRING (TRUENAME tr-comment-file-name))
559
,@(IF TAGS-OUTPUT-STREAM
560
(LIST (TO-MACSYMA-NAMESTRING
561
(TRUENAME TAGS-OUTPUT-STREAM)))
563
#+cl `((mlist) ,(send in-file :truename)
564
,(send transl-file :truename)
565
,(send dsk-msgs-file :truename))))
567
(IF DSK-MSGS-FILE (CLOSE DSK-MSGS-FILE))
568
(IF TRANSL-FILE (CLOSE TRANSL-FILE))
569
(if in-file (close in-file))
570
(IF TAGS-OUTPUT-STREAM (CLOSE TAGS-OUTPUT-STREAM))
571
(WHEN (AND (NOT WINP) (NOT *TRANSL-FILE-DEBUG*))
572
(IF TAGS-OUTPUT-STREAM (DELETEF TAGS-OUTPUT-STREAM))
573
(IF TRANSL-FILE (DELETEF TRANSL-FILE)))))))
577
;; Should be rewritten to use streams. Barf -- perhaps SPRINTER doesn't take
578
;; a stream argument? Yes Carl SPRINTER is old i/o, but KMP is writing
579
;; a new one for NIL. -GJC
583
(OUTFILES (LIST TRANSL-FILE))
586
($LOADPRINT NIL)) ;;; lusing old I/O !!!!!
587
(declare (special OUTFILES))
436
(format t "~&See the `unlisp' file for possible optimizations.~%"))))
439
(defun translate-file (in-file-name out-file-name
441
(ttymsgsp $tr_file_tty_messagesp) &aux warn-file
443
*translation-msgs-files* *untranslated-functions-called* *declared-translated-functions*)
445
(setq *in-translate-file* t)
446
(setq translated-file (alter-pathname (or out-file-name in-file-name) :type "LISP"))
447
(setq warn-file (alter-pathname in-file-name :type "UNLISP"))
448
(with-open-file (in-stream in-file-name)
449
(with-open-file (out-stream translated-file :direction :output
450
:if-exists :supersede)
451
(with-open-file (warn-stream warn-file :direction :output
452
:if-exists :supersede)
453
(setq *translation-msgs-files* (list warn-stream))
455
(setq *translation-msgs-files*
456
(cons *standard-output* *translation-msgs-files*)))
458
";;; -*- Mode: Lisp; package:maxima; syntax:common-lisp ;Base: 10 -*- ;;;~%")
460
(flet ((timezone-iso8601-name (dst tz)
461
;; This function was borrowed from CMUCL.
463
(if (and (not dst) (= tz 0))
465
(multiple-value-bind (hours minutes)
466
(truncate (if dst (1+ tz) tz))
467
(format nil "~C~2,'0D:~2,'0D"
468
(if (minusp tz) #\- #\+)
470
(abs (truncate (* minutes 60)))))))))
472
(multiple-value-bind (secs mins hours day month year dow dst tz)
473
(decode-universal-time (get-universal-time))
474
(declare (ignore dow))
475
(format out-stream ";;; Translated on: ~D-~2,'0D-~2,'0D ~2,'0D:~2,'0D:~2,'0D~A~%"
476
year month day hours mins secs (timezone-iso8601-name dst tz))))
477
(format out-stream ";;; Maxima System version: ~A~%" *autoconf-version*)
478
(format out-stream ";;; Lisp type: ~A~%" (lisp-implementation-type))
479
(format out-stream ";;; Lisp version: ~A~%" (lisp-implementation-version))
481
;; (format out-stream
482
;; ";;Maxima System version ~A"
483
;; (or (si:get-system-version 'maxima)
484
;; (si:get-system-version 'cl-maxima)))
485
(format out-stream "~%(in-package :maxima)")
486
(format warn-stream "~%This is the unlisp file for ~A "
487
(namestring (pathname in-stream)))
489
"~%;;** Variable settings were **~%~%")
490
(loop for v in (cdr $tr_state_vars)
491
do (mformat out-stream ";; ~:M: ~:M;~%" v (symbol-value v)))
492
(mformat *terminal-io* "~%Translation begun on ~A.~%"
493
(pathname in-stream))
494
(call-batch1 in-stream out-stream)
495
(insert-necessary-function-declares warn-stream)
496
;; BATCH1 calls TRANSLATE-MACEXPR-toplevel on each expression read.
500
(list in-stream out-stream warn-stream)))))))))
504
;;(DEFUN TRANSLATE-FILE (IN-FILE-NAME OUT-FILE-NAME TTYMSGSP)
505
;; (BIND-TRANSL-STATE
506
;; (SETQ *IN-TRANSLATE-FILE* T)
508
;; (*TRANSLATION-MSGS-FILES*)
510
;; (TAGS-OUTPUT-STREAM)
511
;; (TAGS-OUTPUT-STREAM-STATE)
513
;; (TRUE-IN-FILE-NAME))
516
;; (SETQ IN-FILE (OPEN IN-FILE-NAME)
517
;; TRUE-IN-FILE-NAME (TO-MACSYMA-NAMESTRING (TRUENAME IN-FILE))
518
;; $TR_TRUE_NAME_OF_FILE_BEING_TRANSLATED TRUE-IN-FILE-NAME
519
;; TRANSL-FILE (DELETE-OLD-AND-OPEN
520
;; (MERGEF (trlisp-outputname-temp)
522
;; DSK-MSGS-FILE (DELETE-OLD-AND-OPEN
524
;; (merge-pathnames out-file-name
525
;; (make-pathname :type "unlisp"))
526
;; #-cl(MERGEF (trcomments-outputname-temp)
529
;; *TRANSLATION-MSGS-FILES* (LIST DSK-MSGS-FILE))
531
;; (SETQ TAGS-OUTPUT-STREAM
532
;; (OPEN-out-dsk (MERGEF (trtags-outputname-temp)
535
;; (SETQ *TRANSLATION-MSGS-FILES*
536
;; (CONS #-cl TYO #+cl *standard-output* *TRANSLATION-MSGS-FILES*)))
537
;; #-cl(PROGN(CLOSE IN-FILE)
538
;; ;; IN-FILE stream of no use with old-io BATCH1.
539
;; (SETQ IN-FILE NIL))
540
;; (MFORMAT DSK-MSGS-FILE "~%This is the `unlisp' file for ~A.~%"
541
;; TRUE-IN-FILE-NAME)
542
;; (MFORMAT *terminal-io* "~%Translation begun on ~A.~%"
543
;; TRUE-IN-FILE-NAME)
544
;; (IF TRF-START-HOOK (FUNCALL TRF-START-HOOK TRUE-IN-FILE-NAME))
546
;; (IF TAGS-OUTPUT-STREAM (TAGS-START//END IN-FILE-NAME))
547
;; (CALL-BATCH1 in-file transl-file)
548
;; ;; BATCH1 calls TRANSLATE-MACEXPR on each expression read.
549
;; (MFORMAT DSK-MSGS-FILE
550
;; "~%//* Variable settings were *//~%~%")
551
;; (DO ((L (CDR $TR_STATE_VARS) (CDR L)))
553
;; (MFORMAT-OPEN DSK-MSGS-FILE
555
;; (CAR L) (SYMBOL-VALUE (CAR L))))
556
;; #-cl(RENAME-TF OUT-FILE-NAME TRUE-IN-FILE-NAME)
557
;; #-cl (WHEN TAGS-OUTPUT-STREAM
559
;; ;;(CLOSE TAGS-OUTPUT-STREAM)
560
;; (RENAMEF TAGS-OUTPUT-STREAM (trtags-outputname)))
561
;; ;;(CLOSE DSK-MSGS-FILE)
562
;; ;; The CLOSE before RENAMEF clobbers the old temp file.
563
;; ;; nope. you get a FILE-ALREADY-EXISTS error. darn.
564
;; (let ((tr-comment-file-name (mergef (trcomments-outputname)
566
;; #-cl (if (probe-file tr-comment-file-name)
567
;; (delete-file tr-comment-file-name))
568
;; #-cl (RENAMEF DSK-MSGS-FILE tr-comment-file-name)
570
;; #-cl`((MLIST) ,(TO-MACSYMA-NAMESTRING TRUE-IN-FILE-NAME)
571
;; ,(TO-MACSYMA-NAMESTRING OUT-FILE-NAME)
572
;; ,(TO-MACSYMA-NAMESTRING (TRUENAME tr-comment-file-name))
573
;; ,@(IF TAGS-OUTPUT-STREAM
574
;; (LIST (TO-MACSYMA-NAMESTRING
575
;; (TRUENAME TAGS-OUTPUT-STREAM)))
577
;; #+cl `((mlist) ,(send in-file :truename)
578
;; ,(send transl-file :truename)
579
;; ,(send dsk-msgs-file :truename))))
580
;; ;; Unwind protected.
581
;; (IF DSK-MSGS-FILE (CLOSE DSK-MSGS-FILE))
582
;; (IF TRANSL-FILE (CLOSE TRANSL-FILE))
583
;; (if in-file (close in-file))
584
;; (IF TAGS-OUTPUT-STREAM (CLOSE TAGS-OUTPUT-STREAM))
585
;; (WHEN (AND (NOT WINP) (NOT *TRANSL-FILE-DEBUG*))
586
;; (IF TAGS-OUTPUT-STREAM (DELETE-FILE TAGS-OUTPUT-STREAM))
587
;; (IF TRANSL-FILE (DELETE-FILE TRANSL-FILE)))))))
590
;; Should be rewritten to use streams. Barf -- perhaps SPRINTER
591
;; doesn't take a stream argument?
592
;; Yes Carl SPRINTER is old i/o, but KMP is writing a new one for NIL. -GJC
596
(outfiles (list transl-file))
599
($loadprint nil)) ;;; lusing old I/O !!!!!
600
(declare (special outfiles))
590
603
;;; i might as well be real pretty and flatten out PROGN's.
592
(DEFUN SUB-PRINT* (P &AUX (FLAG NIL))
594
((AND (EQ (CAR P) 'PROGN) (CDR P) (EQUAL (CADR P) ''COMPILE))
595
(MAPC #'SUB-PRINT* (CDDR P)))
597
(SETQ FLAG (AND $TR_SEMICOMPILE
598
(NOT (MEMQ (CAR P) '(EVAL-WHEN INCLUDEF)))))
599
(WHEN FLAG (PRINC* '|(PROGN|) (TERPRI*))
603
(PRIN1 P TRANSL-FILE)))
604
(WHEN FLAG (PRINC* '|)|))
605
(TERPRI TRANSL-FILE))))
607
(DEFUN PRINC* (FORM) (PRINC FORM TRANSL-FILE))
609
(DEFUN NPRINC* (&REST FORM)
610
(MAPC #'(LAMBDA (X) (PRINC X TRANSL-FILE)) FORM))
612
(DEFUN TERPRI* () (TERPRI TRANSL-FILE))
614
(DEFUN PRINT-MODULE (M)
615
(NPRINC* " " M " version " (GET M 'VERSION)))
617
(DEFUN NEW-COMMENT-LINE ()
621
(defun print-TRANSL-MODULEs ()
623
(PRINT-MODULE 'TRANSL-AUTOLOAD)
625
(S (zl-DELETE 'TRANSL-AUTOLOAD (copy-top-level TRANSL-MODULES ))
628
(IF (= 0 (fixnum-remainder J 3)) (NEW-COMMENT-LINE))
629
(PRINT-MODULE (CAR S))))
632
(DEFUN PRINT-TRANSL-HEADER (SOURCE)
605
(defun sub-print* (p &aux (flag nil))
607
((and (eq (car p) 'progn) (cdr p) (equal (cadr p) ''compile))
608
(mapc #'sub-print* (cddr p)))
610
(setq flag (and $tr_semicompile
611
(not (memq (car p) '(eval-when includef)))))
612
(when flag (princ* '|(PROGN|) (terpri*))
616
(prin1 p transl-file)))
617
(when flag (princ* '|)|))
618
(terpri transl-file))))
620
(defun princ* (form) (princ form transl-file))
622
(defun nprinc* (&rest form)
623
(mapc #'(lambda (x) (princ x transl-file)) form))
625
(defun terpri* () (terpri transl-file))
627
(defun print-module (m)
628
(nprinc* " " m " version " (get m 'version)))
630
(defun new-comment-line ()
634
(defun print-transl-modules ()
636
(print-module 'transl-autoload)
638
(s (zl-delete 'transl-autoload (copy-top-level transl-modules ))
641
(if (= 0 (fixnum-remainder j 3)) (new-comment-line))
642
(print-module (car s))))
645
(defun print-transl-header (source)
634
647
";;; -*- Mode: Lisp; package:maxima; syntax:common-lisp -*-~%")
636
(MFORMAT TRANSL-FILE ";;; Translated code for ~A" SOURCE)
638
";;; Translated MACSYMA functions generated by COMPFILE."))
640
"~%;;; Written on ~:M, from MACSYMA ~A~
649
(mformat transl-file ";;; Translated code for ~A" source)
651
";;; Translated Maxima functions generated by `compfile'."))
653
"~%;;; Written on ~:M, from Maxima ~A~
641
654
~%;;; Translated for ~A~%"
642
($TIMEDATE) $VERSION (sys-user-id))
643
(print-TRANSL-MODULEs)
655
($timedate) $version (sys-user-id))
656
(print-transl-modules)
645
658
;; The INCLUDEF must be in lower case for transportation
646
659
;; of translated code to Multics.
648
661
~%(includef (cond ((status feature ITS) '|DSK:LIBMAX;TPRELU >|)~
649
662
~% ((status feature Multics) '|translate|)~
650
663
~% ((status feature Unix) '|libmax//tprelu.l|)~
651
~% (t (MAXIMA-ERROR '|Unknown system, see GJC@MIT-MC|))))~
664
~% (t (maxima-error '|Unknown system, see GJC@MIT-MC|))))~
653
~%(eval-when (compile eval)~
666
~%(eval-when (compile eval) ~
654
667
~% (or (status feature lispm)~
655
668
~% (setq *infile-name-key*~
656
669
~% ((lambda (file-name)~
660
673
~% (t file-name)))~
661
674
~% (truename infile)))))~
663
~%(eval-when (compile)~
676
~%(eval-when (compile) ~
664
677
~% (setq $tr_semicompile '~S)~
665
678
~% (setq forms-to-compile-queue ()))~
666
679
~%~%(comment ~S)~%~%"
667
$tr_semicompile source)
669
(UPDATE-GLOBAL-DECLARES)
673
";;; General declarations required for translated MACSYMA code.~%"))
674
(PRINT* `(DECLARE . ,DECLARES))))
678
(DEFUN PRINT-ABORT-MSG (FUN FROM)
679
(MFORMAT *TRANSLATION-MSGS-FILES*
680
$tr_semicompile source)
682
(update-global-declares)
686
";;; General declarations required for translated Maxima code.~%"))
687
(print* `(declare . ,declares))))
691
(defun print-abort-msg (fun from)
692
(mformat *translation-msgs-files*
680
693
"~:@M failed to Translate.~
681
694
~%~A will continue, but file output will be aborted."
684
697
(defmacro extension-filename (x) `(caddr (namelist ,x)))
686
(DEFUN RENAME-TF (NEW-NAME TRUE-IN-FILE-NAME)
687
;; copy the TRANSL-FILE to the file of the new name.
691
(SETQ IN-FILE (OPEN-in-dsk TRANSL-FILE))
693
(OPEN-out-dsk (TRUENAME NEW-NAME)))
694
(PRINT-TRANSL-HEADER TRUE-IN-FILE-NAME)
695
(MAPC #'PRINT* (NREVERSE *PRE-TRANSL-FORMS*)) ; clever eh?
697
(PUMP-STREAM IN-FILE TRANSL-FILE)
698
(MFORMAT TRANSL-FILE "~%(compile-forms-to-compile-queue)~%~%")
700
;; if something lost...
701
(IF IN-FILE (CLOSE IN-FILE))
702
(IF TRANSL-FILE (CLOSE TRANSL-FILE)))))
705
(DEFUN PUMP-STREAM (IN OUT &optional (n #-cl (lsh -1 -1)
706
#+cl most-positive-fixnum))
711
(SETQ C (+TYI IN -1))
712
(IF (= C -1) (RETURN NIL))
700
;;(DEFUN RENAME-TF (NEW-NAME TRUE-IN-FILE-NAME)
701
;; ;; copy the TRANSL-FILE to the file of the new name.
705
;; (SETQ IN-FILE (OPEN-in-dsk TRANSL-FILE))
707
;; (OPEN-out-dsk (TRUENAME NEW-NAME)))
708
;; (PRINT-TRANSL-HEADER TRUE-IN-FILE-NAME)
709
;; (MAPC #'PRINT* (NREVERSE *PRE-TRANSL-FORMS*)) ; clever eh?
711
;; (PUMP-STREAM IN-FILE TRANSL-FILE)
712
;; (MFORMAT TRANSL-FILE "~%(compile-forms-to-compile-queue)~%~%")
713
;; (DELETE-FILE IN-FILE))
714
;; ;; if something lost...
715
;; (IF IN-FILE (CLOSE IN-FILE))
716
;; (IF TRANSL-FILE (CLOSE TRANSL-FILE)))))
719
;;(DEFUN PUMP-STREAM (IN OUT &optional (n #-cl (lsh -1 -1)
720
;; #+cl most-positive-fixnum))
721
;; (declare (fixnum n))
724
;; (DECLARE (FIXNUM C))
725
;; (SETQ C (+TYI IN -1))
726
;; (IF (= C -1) (RETURN NIL))
728
;; (SETQ N (f1- N))))
718
(DEFMSPEC $TRANSLATE (FUNCTS) (SETQ FUNCTS (CDR FUNCTS))
719
(COND ((AND FUNCTS ($LISTP (CAR FUNCTS)))
720
(MERROR "Use the function TRANSLATE_FILE"))
722
(COND ((OR (MEMQ '$FUNCTIONS FUNCTS)
724
(SETQ FUNCTS (MAPCAR 'CAAR (CDR $FUNCTIONS)))))
725
(DO ((L FUNCTS (CDR L))
727
((NULL L) `((MLIST) ,@(NREVERSE V)))
728
(COND ((ATOM (CAR L))
729
(LET ((IT (TRANSLATE-FUNCTION ($VERBIFY (CAR L)))))
730
(IF IT (PUSH IT V))))
734
" is an illegal argument to TRANSLATE.")))))))
738
(DECLARE-TOP (SPECIAL forms-to-compile-queue))
739
(DEFMSPEC $COMPILE (FORM)
740
(LET ((L (MEVAL `(($TRANSLATE),@(CDR FORM)))))
741
(LET ((forms-to-compile-queue ()))
742
(MAPC #'(LAMBDA (X) (IF (FBOUNDP X) (COMPILE X))) (CDR L))
744
((NULL FORMS-TO-COMPILE-QUEUE) L)
745
(MAPC #'(LAMBDA (FORM)
748
(EQ (CAR FORM) 'DEFUN)
749
(SYMBOLP (CADR FORM))
750
(COMPILE (CADR FORM))))
751
(PROG1 FORMS-TO-COMPILE-QUEUE
752
(SETQ FORMS-TO-COMPILE-QUEUE NIL)))))))
731
(defmspec $translate (functs) (setq functs (cdr functs))
732
(cond ((and functs ($listp (car functs)))
733
(merror "Use the function `translate_file'"))
735
(cond ((or (memq '$functions functs)
737
(setq functs (mapcar 'caar (cdr $functions)))))
738
(do ((l functs (cdr l))
740
((null l) `((mlist) ,@(nreverse v)))
741
(cond ((atom (car l))
742
(let ((it (translate-function ($verbify (car l)))))
743
(if it (push it v))))
747
" is an illegal argument to `translate'.")))))))
750
(declare-top (special forms-to-compile-queue))
751
(defmspec $compile (form)
752
(let ((l (meval `(($translate),@(cdr form)))))
753
(let ((forms-to-compile-queue ()))
754
(mapc #'(lambda (x) (if (fboundp x) (compile x))) (cdr l))
756
((null forms-to-compile-queue) l)
757
(mapc #'(lambda (form)
760
(eq (car form) 'defun)
761
(symbolp (cadr form))
762
(compile (cadr form))))
763
(prog1 forms-to-compile-queue
764
(setq forms-to-compile-queue nil))))))))