Greetings, thanks so much for your report, and please excuse the delayed
reply!

It sure would be great to support asdf/quicklisp in the next release, so
your efforts are particularly appreciated.

1) I can export chdir, but in truth there are probably quite a few
anomalies in the export list of 'si, and I don't have time for a full
audit now.  In my view, the only people who should care write
(use-package "SI")(chdir ...).  If you are writing (si:chdir ...)
anyway, just add the other colon to be safe.

2) I do think (declaim (ftype function foo)) is wrong, as ftype
explicitly targets the call *signature* and not the type (function) of
the object.  Otherwise ftype and function are completely redundant. But
I do think the generic 'forward reference' is (declaim (ftype (function
(&rest t) (values &rest t)))).  (Or in older GCL parlance, '((*) *)).

3) I do not think this issue lies in pcl, but from your trace rather in 
one of ASDF/SYSTEM:SYSTEM  or ASDF/OPERATE:LOAD-SYSTEM, most likely
because one is calling #'list (or its backquoted equivalent) with too
many arguments.  The generic fix is simple, replace with append or nconc
on sublists.  A more comprehensive, serviceable but potentially more
dangerous approach is to shadow 'list and define it as a macro, as we
currently do in FRICAS.  I can supply details if interested.  In
general, your useful and interesting redefinition of *debugger-hook* is
unnecessary -- typically one does (si::use-fast-links
nil)(buggy-command) and then you are in the native GCL debugger with
keyword arguments.

Please let me know if problems persist.  While it is possible, it is
unlikely I will have time to delve into this deeply myself before the
next release.

Take care,

Frederico Muñoz <[email protected]> writes:

> Hello,
>
> I'm trying to determine the status of Quicklisp with GCL, especially
> considering the advances in ANSI compliance. I've found some apparently
> fixable issues, but stumbled into one that seems substantially more
> involved - but maybe I'm wrong on both counts!
>
> 1. ASDF and chdir
> =================
>
> The current asdf.lisp file has:
>
> :  (defun chdir (x)
> :     "Change current directory, as per POSIX chdir(2), to a given pathname 
> object"
> :     (if-let (x (pathname x))
> :     [...]
> :           #+gcl (system:chdir x)
>
>
> It doesn't seem that chdir is exported though:
>
> : $ gcl
> : GCL (GNU Common Lisp)  2.7.1 Thu Apr 10 09:38:27 PM EDT 2025  ANSI    git: 
> Version_2_7_0
> : [...]
> : >(fboundp 'system:chdir)
> : 
> : Error:
> : Fast links are on: do (si::use-fast-links nil) for debugging
> : Signalled by "AN ANONYMOUS FUNCTION".
> : 
> : INTERNAL-SIMPLE-ERROR: Cannot find the external symbol CHDIR in #<"SYSTEM" 
> package>.
> : 
> : Broken at NIL.  Type :H for Help.
> :     1  Return to top level. 
> : >>1
> : 
> : Top level.
> : >(fboundp 'system::chdir)
> : 
> : T
>
>
> *Fix*: (system::chdir) works, but if it's supposed to be exported, then
>  something is wrong. Otherwise, ASDF should be updated.
>
> 2. ASDF (declaim (ftype ...))
> =============================
>
> Loading asdf.lisp will them give this:
>
> : Error: The FTYPE proclamation (FTYPE FUNCTION ENSURE-PATHNAME) is illegal.
>
> This is because of:
>
> : (with-upgradability ()
> :    (declaim (ftype function ensure-pathname)) ; forward reference
>
> I've read the HyperSpec
> (http://www.ai.mit.edu/projects/iiip/doc/CommonLISP/HyperSpec/Body/dec_ftype.html)
> on FTYPE, and... well, I can see it both ways, this is likely something
> debated to death in terms of spirit vs letter of the spec. I would think
> that "function" by itself would work, but GCL expects (function ...).
>
> This seems to do the trick:
>
> : ;; GCL
> :  (declaim (ftype (function (&rest t) t) ensure-pathname))
>
> *Fix*: if the above is correct, adding a +gcl option that uses it would
>  solve this (or, if there's a consensus that it's the best approach, AND
>  if every other compiler also uses it, change it for all). Either way,
>  easily fixable (unless I'm drastically simplifying things).
>
> 3. LET* and LAMBDA-PARAMETERS-LIMIT < 64
> ========================================
>
> I'm not sure if I got the root cause of this correct, but this is the
> more complex issue. It surfaces when loading Quicklisp setup.lisp, but
> is still in ASDF. This is what happens:
>
> : ;; Loading "init.lsp"
> : ;; Loading #P"/home/fsmunoz/src/lisp/quicklisp-gcl/asdf.lisp"
> : ;; Compiling /tmp/gazonk_543141_0.lsp.
> : [...]
> : ;; Finished loading #P"/tmp/gazonk_543141_0.o"
> : ;; Finished loading #P"/home/fsmunoz/src/lisp/quicklisp-gcl/asdf.lisp"
> : ;; Loading #P"/home/fsmunoz/src/lisp/quicklisp-gcl/quicklisp.lisp"
> : 
> :   ==== quicklisp quickstart 2015-01-28 loaded ====
> : 
> :     To continue with installation, evaluate: (quicklisp-quickstart:install)
> : 
> :     For installation options, evaluate: (quicklisp-quickstart:help)
> : 
> : ;; Finished loading #P"/home/fsmunoz/src/lisp/quicklisp-gcl/quicklisp.lisp"
> : ;; Loading "~/quicklisp/setup.lisp"
> : ;; Finished loading "~/quicklisp/setup.lisp"
> : ;; Compiling /tmp/gazonk_543141_0.lsp.
> : ;; End of Pass 1.  
> : ;; End of Pass 2.  
> : OPTIMIZE levels: Safety=0 (No runtime error checking), Space=0, Speed=3
> : ;; Finished compiling /tmp/gazonk_543141_0.o.
> : ;; Loading #P"/tmp/gazonk_543141_0.o"
> : ;; start address for /tmp/gazonk_543141_0.o 0x3681010
> : ;; Finished loading #P"/tmp/gazonk_543141_0.o"
> : (ql:quickload "alexandria")
> : Error:
> : Signalled by LET*.
> : Condition in LET* [or a callee]: INTERNAL-SIMPLE-PROGRAM-ERROR: LET* [or a 
> callee] requires less than sixty-four arguments.
> : 
> : Broken at SYSTEM::BREAK-LEVEL.  Type :H for Help.
> : [...]
> :   148  Return to debug level 1. 
> :   149  Segmentation violation: c stack ok:signalling errorSegmentation 
> violation: c stack ok:signalling error
> : Unrecoverable error: Segmentation violation..
>
> This happens in (ql:quickload "alexandria"), but seemingly due to
> (asdf:load-system :alexandria) being called:
>
> : ; Loading "init.lsp"
> : ;; Loading #P"/home/fsmunoz/src/lisp/quicklisp-gcl/asdf.lisp"
> : Finished loading "init.lsp"
> : GCL (GNU Common Lisp)  2.7.1 Thu Apr 10 09:38:27 PM EDT 2025  ANSI    git: 
> Version_2_7_0
> : [...]
> : 
> : (asdf:load-system :alexandria)
> : 
> : ;; Compiling /tmp/gazonk_545577_0.lsp.
> : ;; End of Pass 1.  
> : ;; End of Pass 2.  
> : OPTIMIZE levels: Safety=0 (No runtime error checking), Space=0, Speed=3
> : ;; Finished compiling /tmp/gazonk_545577_0.o.
> : ;; Loading #P"/tmp/gazonk_545577_0.o"
> : ;; start address for /tmp/gazonk_545577_0.o 0x367d420
> : ;; Finished loading #P"/tmp/gazonk_545577_0.o"
> : ;; Compiling /tmp/gazonk_545577_0.lsp.
> : ;; End of Pass 1.  
> : ;; End of Pass 2.  
> : OPTIMIZE levels: Safety=0 (No runtime error checking), Space=0, Speed=3
> : ;; Finished compiling /tmp/gazonk_545577_0.o.
> : ;; Loading #P"/tmp/gazonk_545577_0.o"
> : ;; start address for /tmp/gazonk_545577_0.o 0x367e1c0
> : ;; Finished loading #P"/tmp/gazonk_545577_0.o"
> : 
> : Error:
> : Signalled by LET*.
> : Condition in LET* [or a callee]: INTERNAL-SIMPLE-PROGRAM-ERROR: LET* [or a 
> callee] requires less than sixty-four arguments.
> : 
> : Broken at SYSTEM::BREAK-LEVEL.  Type :H for Help.
> : Error:
> : Signalled by SYSTEM:LAMBDA-CLOSURE.
> : 
> :     1  Segmentation violation: c stack ok:signalling error
> : Condition in SYSTEM:LAMBDA-CLOSURE [or a callee]: INTERNAL-SIMPLE-ERROR: 
> Caught fatal error [memory may be damaged]: Segmentation violation.
>
> The reason I'm mentioning LAMBDA-PARAMETERS-LIMIT and PCL is because, and 
> after
> trial and error and following different breadcrumbs, I added this to
> test the PCL hypothesis:
>
> : ;; init.lsp (same dir)
> : [...]
> : (defvar *current-gf* nil)
> : (defvar *gf-log* nil)
> : 
> : ;; Capture the funcall
> : (let ((original (symbol-function 'pcl::set-dfun)))
> :   (setf (symbol-function 'pcl::set-dfun)
> :         (lambda (gf dfun cache info)
> :           (setf *current-gf* gf)
> :           (push (pcl::generic-function-name gf) *gf-log*)
> :           (funcall original gf dfun cache info))))
> : 
> : ;; Add to the debugger hook to print the last iteratction
> : (setf *debugger-hook*
> :       (lambda (condition hook)
> :         (declare (ignore hook))
> :         (format t "Condition: ~A~%" condition)
> :         (dotimes (i (min 30 (si::ihs-top)))
> :           (format t "~2D: ~A~%" i
> :                   (subseq (prin1-to-string (si::ihs-fun i)) 0 80)))
> :         (si::bye 1)))
> : ;; Load alexandria
> : (asdf:load-system :alexandria)
>
> ... which gives this:
>
> : ;; Finished loading #P"/tmp/gazonk_553291_0.o"
> : Condition: Condition in LET* [or a callee]: INTERNAL-SIMPLE-PROGRAM-ERROR: 
> LET* [or a callee] requires less than sixty-four arguments.
> :  0: NIL
> :  1: #<function 000000002db3cb40>
> :  2: (SYSTEM:LAMBDA-CLOSURE
> :  NIL NIL NIL
> :  (ASDF/SYSTEM:SYSTEM
> :   &REST ASDF/OPERATE::K
> :  3: (BLOCK
> :  ASDF/OPERATE:LOAD-SYSTEM
> :  (APPLY
> :   'ASDF/OPERATE:OPERATE 'ASDF/LISP-ACTI
> :  4: #<function 0000000001c006a0>
> :  5: #<function 0000000001c57190>
> :  6: #<function 0000000001c52c00>
> :  7: #<function 000000002db324c0>
> :  8: (SYSTEM:LAMBDA-CLOSURE
> :  NIL NIL NIL
> :  (PCL::.PV-CELL.
> :   PCL::.NEXT-METHOD-CALL. A
> :  9: (BLOCK
> :  ASDF/OPERATE::|(PCL::FAST-METHOD OPERATE :AROUND (T T))|
> :  (MACROLET
> :   ((
> : 10: (MACROLET
> :  ((PCL::PV-ENV
> :    ((PCL::PV PCL::CALLS PCL::PV-TABLE-SYMBOL PCL::PV-PA
> : 11: (MACROLET
> :  ((PCL::CALL-NEXT-METHOD-BIND
> :    (&BODY PCL::BODY) (LIST* 'LET NIL PCL
> : 12: (LET
> :  NIL
> :  (FLET
> :   ((CALL-NEXT-METHOD
> :     (&REST PCL::CNM-ARGS) (DECLARE (DYNAMI
> : 13: (FLET
> :  ((CALL-NEXT-METHOD
> :    (&REST PCL::CNM-ARGS) (DECLARE (DYNAMIC-EXTENT PCL:
> : 14: (LET*
> :  ((#:G157
> :    (LIST*
> :     ASDF/OPERATION:OPERATION ASDF/COMPONENT:COMPONENT 
> : 15: (BLOCK
> :  ASDF/OPERATE:OPERATE
> :  (UIOP/UTILITY:NEST
> :   (ASDF/SESSION:WITH-ASDF-SESSI
> : [...]
>
> I'm not sure what to make of this (or even the validity), but the idea
> that there's a conflict between how the PCL dispatch works, possibly
> accumulating arguments that exceed the (relatively low)
> MAX_ARGS/LAMBDA-PARAMETERS-LIMIT of GCL (SBCL has 1073741824, for
> example).
>
> I'm using a init.lsp in the CWD... maybe I've missed it, but if not,
> it would actually be a good thing to have a ~/.gclrc or something.
>
> Anyway, I'm sure that this is probably the wrong take, but if nothing
> else I wanted to share it with others, perhaps there's something that
> can be done to improve ASDF/Quicklisp support - which would be a
> significant feature IMO.
>
> All the best,

-- 
Camm Maguire                                        [email protected]
==========================================================================
"The earth is but one country, and mankind its citizens."  --  Baha'u'llah

Reply via email to