fae86a2bd48b9bdc4faca851a1b30e12216d8286
[bpt/guile.git] / module / language / elisp / boot.el
1 ;;; Guile Emacs Lisp -*- lexical-binding: t -*-
2
3 ;;; Copyright (C) 2011 Free Software Foundation, Inc.
4
5 ;;; This library is free software; you can redistribute it and/or modify
6 ;;; it under the terms of the GNU Lesser General Public License as
7 ;;; published by the Free Software Foundation; either version 3 of the
8 ;;; License, or (at your option) any later version.
9 ;;;
10 ;;; This library is distributed in the hope that it will be useful, but
11 ;;; WITHOUT ANY WARRANTY; without even the implied warranty of
12 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 ;;; Lesser General Public License for more details.
14 ;;;
15 ;;; You should have received a copy of the GNU Lesser General Public
16 ;;; License along with this library; if not, write to the Free Software
17 ;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18 ;;; 02110-1301 USA
19
20 ;;; Code:
21
22 (defmacro @ (module symbol)
23 `(guile-ref ,module ,symbol))
24
25 (defmacro @@ (module symbol)
26 `(guile-private-ref ,module ,symbol))
27
28 (defmacro defun (name args &rest body)
29 `(let ((proc (function (lambda ,args ,@body))))
30 (%funcall (@ (language elisp runtime) set-symbol-function!)
31 ',name
32 proc)
33 (%funcall (@ (guile) set-procedure-property!)
34 proc 'name ',name)
35 ',name))
36
37 (defun omega () (omega))
38
39 (defmacro eval-and-compile (&rest body)
40 `(progn
41 (eval-when-compile ,@body)
42 (progn ,@body)))
43
44 (defmacro %define-compiler-macro (name args &rest body)
45 `(eval-and-compile
46 (%funcall
47 (@ (language elisp runtime) set-symbol-plist!)
48 ',name
49 (%funcall
50 (@ (guile) cons*)
51 '%compiler-macro
52 #'(lambda ,args ,@body)
53 (%funcall (@ (language elisp runtime) symbol-plist) ',name)))
54 ',name))
55
56 (defmacro defsubst (name args &rest body)
57 `(progn
58 (defun ,name ,args ,@body)
59 (eval-and-compile
60 (%define-compiler-macro ,name (form)
61 (%funcall (@ (guile) cons*)
62 '%funcall
63 (%funcall
64 (@ (guile) list)
65 'function
66 (%funcall (@ (guile) cons*) 'lambda ',args ',body))
67 (%funcall (@ (guile) cdr) form))))))
68
69 (eval-and-compile
70 (defun eval (form)
71 (%funcall (@ (language elisp runtime) eval-elisp) form)))
72
73 (eval-and-compile
74 (defun null (object)
75 (if object nil t))
76 (defun consp (object)
77 (%funcall (@ (guile) pair?) object))
78 (defun listp (object)
79 (if object (consp object) t))
80 (defun car (list)
81 (if list (%funcall (@ (guile) car) list) nil))
82 (defun cdr (list)
83 (if list (%funcall (@ (guile) cdr) list) nil))
84 (defun make-symbol (name)
85 (%funcall (@ (guile) make-symbol) name))
86 (defun gensym ()
87 (%funcall (@ (guile) gensym)))
88 (defun signal (error-symbol data)
89 (%funcall (@ (guile) throw) 'elisp-condition error-symbol data)))
90
91 (defmacro lambda (&rest cdr)
92 `#'(lambda ,@cdr))
93
94 (defmacro prog1 (first &rest body)
95 (let ((temp (gensym)))
96 `(let ((,temp ,first))
97 (declare (lexical ,temp))
98 ,@body
99 ,temp)))
100
101 (defun interactive (&optional arg)
102 nil)
103
104 (defmacro prog2 (form1 form2 &rest body)
105 `(progn ,form1 (prog1 ,form2 ,@body)))
106
107 (defmacro cond (&rest clauses)
108 (if (null clauses)
109 nil
110 (let ((first (car clauses))
111 (rest (cdr clauses)))
112 (if (listp first)
113 (let ((condition (car first))
114 (body (cdr first)))
115 (if (null body)
116 (let ((temp (gensym)))
117 `(let ((,temp ,condition))
118 (declare (lexical ,temp))
119 (if ,temp
120 ,temp
121 (cond ,@rest))))
122 `(if ,condition
123 (progn ,@body)
124 (cond ,@rest))))
125 (signal 'wrong-type-argument `(listp ,first))))))
126
127 (defmacro and (&rest conditions)
128 (cond ((null conditions) t)
129 ((null (cdr conditions)) (car conditions))
130 (t `(if ,(car conditions)
131 (and ,@(cdr conditions))
132 nil))))
133
134 (defmacro or (&rest conditions)
135 (cond ((null conditions) nil)
136 ((null (cdr conditions)) (car conditions))
137 (t (let ((temp (gensym)))
138 `(let ((,temp ,(car conditions)))
139 (declare (lexical ,temp))
140 (if ,temp
141 ,temp
142 (or ,@(cdr conditions))))))))
143
144 (defmacro lexical-let (bindings &rest body)
145 (labels ((loop (list vars)
146 (if (null list)
147 `(let ,bindings
148 (declare (lexical ,@vars))
149 ,@body)
150 (loop (cdr list)
151 (if (consp (car list))
152 `(,(car (car list)) ,@vars)
153 `(,(car list) ,@vars))))))
154 (loop bindings '())))
155
156 (defmacro lexical-let* (bindings &rest body)
157 (labels ((loop (list vars)
158 (if (null list)
159 `(let* ,bindings
160 (declare (lexical ,@vars))
161 ,@body)
162 (loop (cdr list)
163 (if (consp (car list))
164 (cons (car (car list)) vars)
165 (cons (car list) vars))))))
166 (loop bindings '())))
167
168 (defmacro while (test &rest body)
169 (let ((loop (gensym)))
170 `(labels ((,loop ()
171 (if ,test
172 (progn ,@body (,loop))
173 nil)))
174 (,loop))))
175
176 (defmacro unwind-protect (bodyform &rest unwindforms)
177 `(%funcall (@ (guile) dynamic-wind)
178 #'(lambda () nil)
179 #'(lambda () ,bodyform)
180 #'(lambda () ,@unwindforms)))
181
182 (defmacro when (cond &rest body)
183 `(if ,cond
184 (progn ,@body)))
185
186 (defmacro unless (cond &rest body)
187 `(when (not ,cond)
188 ,@body))
189
190 (defun symbolp (object)
191 (%funcall (@ (guile) symbol?) object))
192
193 (defun %functionp (object)
194 (%funcall (@ (guile) procedure?) object))
195
196 (defun symbol-function (symbol)
197 (let ((f (%funcall (@ (language elisp runtime) symbol-function)
198 symbol)))
199 (if (%funcall (@ (language elisp falias) falias?) f)
200 (%funcall (@ (language elisp falias) falias-object) f)
201 f)))
202
203 (defun eval (form)
204 (%funcall (@ (system base compile) compile)
205 form
206 (%funcall (@ (guile) symbol->keyword) 'from)
207 'elisp
208 (%funcall (@ (guile) symbol->keyword) 'to)
209 'value))
210
211 (defun %indirect-function (object)
212 (cond
213 ((%functionp object)
214 object)
215 ((null object)
216 (signal 'void-function nil))
217 ((symbolp object) ;++ cycle detection
218 (%indirect-function
219 (%funcall (@ (language elisp runtime) symbol-function) object)))
220 ((listp object)
221 (eval `(function ,object)))
222 (t
223 (signal 'invalid-function `(,object)))))
224
225 (defun apply (function &rest arguments)
226 (%funcall (@ (guile) apply)
227 (@ (guile) apply)
228 (%indirect-function function)
229 arguments))
230
231 (defun funcall (function &rest arguments)
232 (%funcall (@ (guile) apply)
233 (%indirect-function function)
234 arguments))
235
236 (defun autoload-do-load (fundef &optional funname macro-only)
237 (and (load (cadr fundef))
238 (%indirect-function funname)))
239
240 (defun fset (symbol definition)
241 (funcall (@ (language elisp runtime) set-symbol-function!)
242 symbol
243 definition))
244
245 (defun eq (obj1 obj2)
246 (if obj1
247 (%funcall (@ (guile) eq?) obj1 obj2)
248 (if obj2 nil t)))
249
250 (defun nthcdr (n list)
251 (let ((i 0))
252 (while (< i n)
253 (setq list (cdr list)
254 i (+ i 1)))
255 list))
256
257 (defun nth (n list)
258 (car (nthcdr n list)))
259
260 (defun fset (symbol definition)
261 (funcall (@ (language elisp runtime) set-symbol-function!)
262 symbol
263 (cond
264 ((%funcall (@ (guile) procedure?) definition)
265 definition)
266 ((and (consp definition)
267 (eq (car definition) 'macro))
268 (if (%funcall (@ (guile) procedure?) (cdr definition))
269 definition
270 (cons 'macro
271 (funcall (@ (language elisp falias) make-falias)
272 (function
273 (lambda (&rest args) (apply (cdr definition) args)))
274 (cdr definition)))))
275 ((and (consp definition)
276 (eq (car definition) 'autoload))
277 (if (or (eq (nth 4 definition) 'macro)
278 (eq (nth 4 definition) t))
279 (cons 'macro
280 (funcall
281 (@ (language elisp falias) make-falias)
282 (function (lambda (&rest args)
283 (apply (cdr (autoload-do-load definition symbol nil)) args)))
284 definition))
285 (funcall
286 (@ (language elisp falias) make-falias)
287 (function (lambda (&rest args)
288 (apply (autoload-do-load definition symbol nil) args)))
289 definition)))
290 (t
291 (funcall (@ (language elisp falias) make-falias)
292 (function (lambda (&rest args) (apply definition args)))
293 definition))))
294 definition)
295
296 (defun gload (file)
297 (funcall (@ (system base compile) compile-file)
298 file
299 (funcall (@ (guile) symbol->keyword) 'from)
300 'elisp
301 (funcall (@ (guile) symbol->keyword) 'to)
302 'value)
303 t)
304
305 ;;; Equality predicates
306
307 (defun eql (obj1 obj2)
308 (if obj1
309 (funcall (@ (guile) eqv?) obj1 obj2)
310 (null obj2)))
311
312 (defun equal (obj1 obj2)
313 (if obj1
314 (funcall (@ (guile) equal?) obj1 obj2)
315 (null obj2)))
316
317 ;;; Symbols
318
319 ;;; `symbolp' and `symbol-function' are defined above.
320
321 (fset 'symbol-name (@ (guile) symbol->string))
322 (fset 'symbol-value (@ (language elisp runtime) symbol-value))
323 (fset 'set (@ (language elisp runtime) set-symbol-value!))
324 (fset 'makunbound (@ (language elisp runtime) makunbound!))
325 (fset 'fmakunbound (@ (language elisp runtime) fmakunbound!))
326 (fset 'boundp (@ (language elisp runtime) symbol-bound?))
327 (fset 'fboundp (@ (language elisp runtime) symbol-fbound?))
328 (fset 'intern (@ (guile) string->symbol))
329
330 ;(defun defvaralias (new-alias base-variable &optional docstring)
331 ; (let ((fluid (funcall (@ (language elisp runtime) symbol-fluid)
332 ; base-variable)))
333 ; (funcall (@ (language elisp runtime) set-symbol-fluid!)
334 ; new-alias
335 ; fluid)
336 ; base-variable))
337
338 ;;; Numerical type predicates
339
340 (defun floatp (object)
341 (and (funcall (@ (guile) real?) object)
342 (or (funcall (@ (guile) inexact?) object)
343 (null (funcall (@ (guile) integer?) object)))))
344
345 (defun integerp (object)
346 (and (funcall (@ (guile) integer?) object)
347 (funcall (@ (guile) exact?) object)))
348
349 (defun numberp (object)
350 (funcall (@ (guile) real?) object))
351
352 (defun wholenump (object)
353 (and (integerp object) (>= object 0)))
354
355 (defun zerop (object)
356 (= object 0))
357
358 ;;; Numerical comparisons
359
360 (fset '= (@ (guile) =))
361
362 (defun /= (num1 num2)
363 (null (= num1 num2)))
364
365 (fset '< (@ (guile) <))
366 (fset '<= (@ (guile) <=))
367 (fset '> (@ (guile) >))
368 (fset '>= (@ (guile) >=))
369
370 (defun max (&rest numbers)
371 (apply (@ (guile) max) numbers))
372
373 (defun min (&rest numbers)
374 (apply (@ (guile) min) numbers))
375
376 ;;; Arithmetic functions
377
378 (fset '1+ (@ (guile) 1+))
379 (fset '1- (@ (guile) 1-))
380 (fset '+ (@ (guile) +))
381 (fset '- (@ (guile) -))
382 (fset '* (@ (guile) *))
383 (fset '% (@ (guile) modulo))
384 (fset 'abs (@ (guile) abs))
385
386 ;;; Floating-point rounding
387
388 (fset 'ffloor (@ (guile) floor))
389 (fset 'fceiling (@ (guile) ceiling))
390 (fset 'ftruncate (@ (guile) truncate))
391 (fset 'fround (@ (guile) round))
392
393 ;;; Numeric conversion
394
395 (defun float (arg)
396 (if (numberp arg)
397 (funcall (@ (guile) exact->inexact) arg)
398 (signal 'wrong-type-argument `(numberp ,arg))))
399
400 ;;; List predicates
401
402 (fset 'not #'null)
403
404 (defun atom (object)
405 (null (consp object)))
406
407 (defun nlistp (object)
408 (null (listp object)))
409
410 ;;; Lists
411
412 (fset 'cons (@ (guile) cons))
413 (fset 'list (@ (guile) list))
414 (fset 'make-list (@ (guile) make-list))
415 (fset 'append (@ (guile) append))
416 (fset 'reverse (@ (guile) reverse))
417 (fset 'nreverse (@ (guile) reverse!))
418
419 (defun car-safe (object)
420 (if (consp object)
421 (car object)
422 nil))
423
424 (defun cdr-safe (object)
425 (if (consp object)
426 (cdr object)
427 nil))
428
429 (defun setcar (cell newcar)
430 (if (consp cell)
431 (progn
432 (funcall (@ (guile) set-car!) cell newcar)
433 newcar)
434 (signal 'wrong-type-argument `(consp ,cell))))
435
436 (defun setcdr (cell newcdr)
437 (if (consp cell)
438 (progn
439 (funcall (@ (guile) set-cdr!) cell newcdr)
440 newcdr)
441 (signal 'wrong-type-argument `(consp ,cell))))
442
443 (defun %member (elt list test)
444 (cond
445 ((null list) nil)
446 ((consp list)
447 (if (funcall test elt (car list))
448 list
449 (%member elt (cdr list) test)))
450 (t (signal 'wrong-type-argument `(listp ,list)))))
451
452 (defun member (elt list)
453 (%member elt list #'equal))
454
455 (defun memql (elt list)
456 (%member elt list #'eql))
457
458 (defun memq (elt list)
459 (%member elt list #'eq))
460
461 (defun assoc (key list)
462 (funcall (@ (srfi srfi-1) assoc) key list #'equal))
463
464 (defun assq (key list)
465 (funcall (@ (srfi srfi-1) assoc) key list #'eq))
466
467 (defun rplaca (cell newcar)
468 (funcall (@ (guile) set-car!) cell newcar)
469 newcar)
470
471 (defun rplacd (cell newcdr)
472 (funcall (@ (guile) set-cdr!) cell newcdr)
473 newcdr)
474
475 (defun caar (x)
476 (car (car x)))
477
478 (defun cadr (x)
479 (car (cdr x)))
480
481 (defun cdar (x)
482 (cdr (car x)))
483
484 (defun cddr (x)
485 (cdr (cdr x)))
486
487 (defmacro dolist (spec &rest body)
488 (apply #'(lambda (var list &optional result)
489 (list 'progn
490 (list 'mapc
491 (cons 'lambda (cons (list var) body))
492 list)
493 result))
494 spec))
495
496 ;;; Strings
497
498 (defun string (&rest characters)
499 (funcall (@ (guile) list->string)
500 (mapcar (@ (guile) integer->char) characters)))
501
502 (defun stringp (object)
503 (funcall (@ (guile) string?) object))
504
505 (defun string-equal (s1 s2)
506 (let ((s1 (if (symbolp s1) (symbol-name s1) s1))
507 (s2 (if (symbolp s2) (symbol-name s2) s2)))
508 (funcall (@ (guile) string=?) s1 s2)))
509
510 (fset 'string= 'string-equal)
511
512 (defun substring (string from &optional to)
513 (apply (@ (guile) substring) string from (if to (list to) nil)))
514
515 (defun upcase (obj)
516 (funcall (@ (guile) string-upcase) obj))
517
518 (defun downcase (obj)
519 (funcall (@ (guile) string-downcase) obj))
520
521 (defun string-match (regexp string &optional start)
522 (let ((m (funcall (@ (ice-9 regex) string-match)
523 regexp
524 string
525 (or start 0))))
526 (if m
527 (funcall (@ (ice-9 regex) match:start) m 0)
528 nil)))
529
530 ;; Vectors
531
532 (defun make-vector (length init)
533 (funcall (@ (guile) make-vector) length init))
534
535 ;;; Sequences
536
537 (defun length (sequence)
538 (funcall (if (listp sequence)
539 (@ (guile) length)
540 (@ (guile) generalized-vector-length))
541 sequence))
542
543 (defun mapcar (function sequence)
544 (funcall (@ (guile) map) function sequence))
545
546 (defun mapc (function sequence)
547 (funcall (@ (guile) for-each) function sequence)
548 sequence)
549
550 (defun aref (array idx)
551 (funcall (@ (guile) generalized-vector-ref) array idx))
552
553 (defun aset (array idx newelt)
554 (funcall (@ (guile) generalized-vector-set!) array idx newelt)
555 newelt)
556
557 (defun concat (&rest sequences)
558 (apply (@ (guile) string-append) sequences))
559
560 ;;; Property lists
561
562 (defun %plist-member (plist property test)
563 (cond
564 ((null plist) nil)
565 ((consp plist)
566 (if (funcall test (car plist) property)
567 (cdr plist)
568 (%plist-member (cdr (cdr plist)) property test)))
569 (t (signal 'wrong-type-argument `(listp ,plist)))))
570
571 (defun %plist-get (plist property test)
572 (car (%plist-member plist property test)))
573
574 (defun %plist-put (plist property value test)
575 (let ((x (%plist-member plist property test)))
576 (if x
577 (progn (setcar x value) plist)
578 (cons property (cons value plist)))))
579
580 (defun plist-get (plist property)
581 (%plist-get plist property #'eq))
582
583 (defun plist-put (plist property value)
584 (%plist-put plist property value #'eq))
585
586 (defun plist-member (plist property)
587 (%plist-member plist property #'eq))
588
589 (defun lax-plist-get (plist property)
590 (%plist-get plist property #'equal))
591
592 (defun lax-plist-put (plist property value)
593 (%plist-put plist property value #'equal))
594
595 (defvar plist-function (funcall (@ (guile) make-object-property)))
596
597 (defun symbol-plist (symbol)
598 (funcall plist-function symbol))
599
600 (defun setplist (symbol plist)
601 (funcall (funcall (@ (guile) setter) plist-function) symbol plist))
602
603 (defun get (symbol propname)
604 (plist-get (symbol-plist symbol) propname))
605
606 (defun put (symbol propname value)
607 (setplist symbol (plist-put (symbol-plist symbol) propname value)))
608
609 ;;; Nonlocal exits
610
611 (defmacro condition-case (var bodyform &rest handlers)
612 (let ((key (make-symbol "key"))
613 (error-symbol (make-symbol "error-symbol"))
614 (data (make-symbol "data"))
615 (conditions (make-symbol "conditions")))
616 (flet ((handler->cond-clause (handler)
617 `((or ,@(mapcar #'(lambda (c) `(memq ',c ,conditions))
618 (if (consp (car handler))
619 (car handler)
620 (list (car handler)))))
621 ,@(cdr handler))))
622 `(funcall (@ (guile) catch)
623 'elisp-condition
624 #'(lambda () ,bodyform)
625 #'(lambda (,key ,error-symbol ,data)
626 (declare (lexical ,key ,error-symbol ,data))
627 (let ((,conditions
628 (get ,error-symbol 'error-conditions))
629 ,@(if var
630 `((,var (cons ,error-symbol ,data)))
631 '()))
632 (declare (lexical ,conditions
633 ,@(if var `(,var) '())))
634 (cond ,@(mapcar #'handler->cond-clause handlers)
635 (t (signal ,error-symbol ,data)))))))))
636
637 (put 'error 'error-conditions '(error))
638 (put 'wrong-type-argument 'error-conditions '(wrong-type-argument error))
639 (put 'invalid-function 'error-conditions '(invalid-function error))
640 (put 'no-catch 'error-conditions '(no-catch error))
641 (put 'throw 'error-conditions '(throw))
642
643 (defvar %catch nil)
644
645 (defmacro catch (tag &rest body)
646 (let ((tag-value (make-symbol "tag-value"))
647 (c (make-symbol "c"))
648 (data (make-symbol "data")))
649 `(let ((,tag-value ,tag))
650 (declare (lexical ,tag-value))
651 (condition-case ,c
652 (let ((%catch t))
653 ,@body)
654 (throw
655 (let ((,data (cdr ,c)))
656 (declare (lexical ,data))
657 (if (eq (car ,data) ,tag-value)
658 (car (cdr ,data))
659 (apply #'throw ,data))))))))
660
661 (defun throw (tag value)
662 (signal (if %catch 'throw 'no-catch) (list tag value)))
663
664 ;;; I/O
665
666 (defun princ (object)
667 (funcall (@ (guile) display) object))
668
669 (defun print (object)
670 (funcall (@ (guile) write) object))
671
672 (defun prin1 (object)
673 (funcall (@ (guile) write) object))
674
675 (defun terpri ()
676 (funcall (@ (guile) newline)))
677
678 (defun format* (stream string &rest args)
679 (apply (@ (guile) format) stream string args))
680
681 (defun send-string-to-terminal (string)
682 (princ string))
683
684 (defun read-from-minibuffer (prompt &rest ignore)
685 (princ prompt)
686 (let ((value (funcall (@ (ice-9 rdelim) read-line))))
687 (if (funcall (@ (guile) eof-object?) value)
688 ""
689 value)))
690
691 (defun prin1-to-string (object)
692 (format* nil "~S" object))
693
694 ;; Random number generation
695
696 (defvar %random-state (funcall (@ (guile) copy-random-state)
697 (@ (guile) *random-state*)))
698
699 (defun random (&optional limit)
700 (if (eq limit t)
701 (setq %random-state
702 (funcall (@ (guile) random-state-from-platform))))
703 (funcall (@ (guile) random)
704 (if (wholenump limit)
705 limit
706 (@ (guile) most-positive-fixnum))
707 %random-state))
708
709 (defmacro save-excursion (&rest body)
710 `(call-with-save-excursion #'(lambda () ,@body)))
711
712 (defmacro save-current-buffer (&rest body)
713 `(call-with-save-current-buffer #'(lambda () ,@body)))
714
715 (defmacro save-restriction (&rest body)
716 `(call-with-save-restriction #'(lambda () ,@body)))
717
718 (defmacro track-mouse (&rest body)
719 `(call-with-track-mouse #'(lambda () ,@body)))
720
721 (defmacro setq-default (var value &rest args)
722 `(progn (set-default ',var ,value)
723 ,(if (null args)
724 var
725 `(setq-default ,@args))))
726
727 (defmacro catch (tag &rest body)
728 `(call-with-catch ,tag #'(lambda () ,@body)))
729
730 (defmacro condition-case (var bodyform &rest args)
731 (if (consp args)
732 (let* ((handler (car args))
733 (handlers (cdr args))
734 (handler-conditions (car handler))
735 (handler-body (cdr handler)))
736 `(call-with-handler ',var
737 ',handler-conditions
738 #'(lambda () ,@handler-body)
739 #'(lambda ()
740 (condition-case ,var
741 ,bodyform
742 ,@handlers))))
743 bodyform))
744
745 (defun backtrace-frame (nframes)
746 (let* ((stack (funcall (@ (guile) make-stack) t))
747 (frame (stack-ref stack nframes))
748 (proc (funcall (@ (guile) frame-procedure) frame))
749 (pname (or (and (%functionp proc)
750 (funcall (@ (guile) procedure-name) proc))
751 proc))
752 (args (funcall (@ (guile) frame-arguments) frame)))
753 (cons t (cons pname args))))
754
755 (defun backtrace ()
756 (interactive)
757 (let* ((stack (funcall (@ (guile) make-stack) t))
758 (frame (funcall (@ (guile) stack-ref) stack 1))
759 (space (funcall (@ (guile) integer->char) 32)))
760 (while frame
761 (princ (string 32 32))
762 (let ((proc (funcall (@ (guile) frame-procedure) frame)))
763 (prin1 (or (and (%functionp proc)
764 (funcall (@ (guile) procedure-name) proc))
765 proc)))
766 (prin1 (funcall (@ (guile) frame-arguments) frame))
767 (terpri)
768 (setq frame (funcall (@ (guile) frame-previous) frame)))
769 nil))
770
771 (defun %set-eager-macroexpansion-mode (ignore)
772 nil)