- {
- SCM name, code, env;
- if (SCM_TYP16 (exp) == scm_tc16_macro)
- {
- /* Printing a macro. */
- prinmacro:
- name = scm_macro_name (exp);
- if (!SCM_CLOSUREP (SCM_CDR (exp)))
- {
- code = env = SCM_UNDEFINED;
- scm_puts ("#<primitive-", port);
- }
- else
- {
- code = SCM_CODE (SCM_CDR (exp));
- env = SCM_ENV (SCM_CDR (exp));
- scm_puts ("#<", port);
- }
- if (SCM_CELL_WORD_0 (exp) & (3L << 16))
- scm_puts ("macro", port);
- else
- scm_puts ("syntax", port);
- if (SCM_CELL_WORD_0 (exp) & (2L << 16))
- scm_putc ('!', port);
- }
- else
- {
- /* Printing a closure. */
- name = scm_procedure_name (exp);
- code = SCM_CODE (exp);
- env = SCM_ENV (exp);
- scm_puts ("#<procedure", port);
- }
- if (SCM_SYMBOLP (name))
- {
- scm_putc (' ', port);
- scm_lfwrite (SCM_SYMBOL_CHARS (name), SCM_SYMBOL_LENGTH (name), port);
- }
- else if (SCM_STRINGP (name))
- {
- scm_putc (' ', port);
- scm_lfwrite (SCM_STRING_CHARS (name), SCM_STRING_LENGTH (name), port);
- }
- if (!SCM_UNBNDP (code))
- {
- if (SCM_PRINT_SOURCE_P)
- {
- code = scm_unmemocopy (code,
- SCM_EXTEND_ENV (SCM_CAR (code),
- SCM_EOL,
- env));
- ENTER_NESTED_DATA (pstate, exp, circref);
- scm_iprlist (" ", code, '>', port, pstate);
- EXIT_NESTED_DATA (pstate);
- }
- else
- {
- if (SCM_TYP16 (exp) != scm_tc16_macro)
- {
- scm_putc (' ', port);
- scm_iprin1 (SCM_CAR (code), port, pstate);
- }
- scm_putc ('>', port);
- }
- }
- else
+ {
+ SCM formals = SCM_CLOSURE_FORMALS (exp);
+ scm_puts ("#<procedure", port);
+ scm_putc (' ', port);
+ scm_iprin1 (scm_procedure_name (exp), port, pstate);
+ scm_putc (' ', port);
+ if (SCM_PRINT_SOURCE_P)
+ {
+ SCM env = SCM_ENV (exp);
+ SCM xenv = SCM_EXTEND_ENV (formals, SCM_EOL, env);
+ SCM src = scm_unmemocopy (SCM_CODE (exp), xenv);
+ ENTER_NESTED_DATA (pstate, exp, circref);
+ scm_iprin1 (src, port, pstate);
+ EXIT_NESTED_DATA (pstate);
+ }
+ else
+ scm_iprin1 (formals, port, pstate);