[cmucl-imp] Function with declared result type NIL returned.

Raymond Toy toy.raymond at gmail.com
Wed Jun 15 18:21:47 UTC 2016


>>>>> "Raymond" == Raymond Toy <toy.raymond at gmail.com> writes:

>>>>> "Mark" == Mark Cox <markcox80 at gmail.com> writes:
    Mark> G'day, I think there may be an issue with the way CMUCL
    Mark> handles return values.

    Mark> I'm having trouble developing a reduced test case so I have
    Mark> attached the code I encountered the issue with. The code
    Mark> relies on an external library titled external-program.

    Raymond> Thanks for the test case.  I can reproduce this on my
    Raymond> system as well.

    Raymond> Based on the error message it seems as if
    Raymond> external-program:start was declared not to return
    Raymond> actually returned.  That would seem to indicate an error
    Raymond> in external-program not cmucl.

Ok, I think it's probably caused by the defgeneric form that defines
the method:

(defgeneric start
    (program args
     &key
     input if-input-does-not-exist output if-output-exists error if-error-exists
     environment replace-environment-p
     status-hook)
...
  (:method (program args &rest rest)
    (declare (ignore program args rest))
    (error "This CL implementation does not support START.")))

Because this particular method ends with a call to error, it can never
return, and thus has a return type of NIL.  (A return type of NULL
means it can return NIL.  NIL means it doesn't return.)

I think this is confusing cmucl.  Not sure how to fix this in PCL.
I also don't understand why the compilation of cmucl.lisp to add the
actual method doesn't override this declaration.

The hacky solution is to add #-cmucl for that method in the
defgeneric.  This makes things work.

--
Ray



More information about the cmucl-imp mailing list