Re: If it looks like a bug and smells like a bug .....

"Michał "phoe" Herda (as phoe at disroot dot org)" <[email protected]>
Newsgroups gmane.lisp.lispworks.general
Message-ID <[email protected]>
No, they do not appear before &KEY, they appear right where they should.

The lambda list of SOME-FCN is (record-type &rest initargs &key foo). 
Your call looks like (some-fcn 'record :x 1 :y 2). Variable RECORD-TYPE 
is bound to the symbol RECORD. INITARGS is bound to the list (:X 1 :Y 
2). Then keyword parameter processing kicks in, performing keyword 
argument checking as per CLHS 3.5.1.4, and an error is signaled because 
:X is not listed as a valid keyword in the lambda list of SOME-FCN 
(unlike :FOO).

Everything seems OK here for me.

On 5.05.2025 16:37, Paul Werkowski wrote:
> :x & :y sould NOT be recognized as keywords because they appear before 
> &key.
>
> On 5/5/2025 10:29 AM, Michał "phoe" Herda wrote:
>> In your example, TEST1 is calling SOME-FCN with keys :X and :Y, 
>> neither of which is specified in SOME-FCN's lambda list, so an error 
>> is signaled. This is exactly the case specified in CLHS 3.5.1.4 
>> Unrecognized Keyword Arguments.
>>
>> What exactly is the bug here?
>>
>> On 5.05.2025 16:21, Paul Werkowski (as pw at snoopy dot qozzy dot 
>> com) wrote:
>>> From LispWorks CLIM 2.0 User Guide:
>>>
>>> invoke-with-output-to-output-record Generic Function
>>>
>>> (invoke-with-output-to-output-record
>>>  stream continuation record-type &rest init-args &key)
>>> ......
>>> continuation is a function of two arguments, the stream and the 
>>> output record; it has dynamic extent. record-type is the type of 
>>> output record to create. init-args are CLOS initialization arguments 
>>> that are passed to make-instance when the new output record is created.
>>>
>>> CLTL page 76 deals with parsing lambda-lists. The &rest var is a 
>>> list of everything else up to the ending #\). Keywords are not 
>>> recognized as such until after the &key marker.
>>>
>>> Consider this example:
>>>
>>> (defclass record ()
>>>   ((s1 :initarg :x)
>>>    (s2 :initarg :y)))
>>>
>>> (defun some-fcn (record-type &rest initargs &key foo)
>>>   (print initargs)
>>>   (apply 'make-instance record-type initargs))
>>>
>>> (defun test1 ()
>>>   (some-fcn  'record :x 1 :y 2))
>>>
>>> > (test1)
>>> Error: Unexpected keyword :X which is not one of (:FOO).
>>>   1 (continue) Ignore the unknown keyword :X.
>>>   2 (abort) Return to top loop level 0.
>>>
>>> This is exactly the form of error message  generated by nested 
>>> macros deep in the weeds of McCLIM table formatting code.
>>>
>>> This can be dealt with (sort of) by something like this:
>>>
>>> (defun test2 ()
>>>   (handler-bind ((conditions:unknown-keyword-error
>>>                   #'(lambda(c)
>>>                       (invoke-restart 'continue))))
>>>     (some-fcn  'record :x 1 :y 2)))
>>>
>>> > (test2)
>>> (:X 1 :Y 2)
>>> #<RECORD 401000C663>
>>>
>>>
>>> but not very useful in a large software system.
>>>
>>> Same issue with LWW 7.1.
>>>
>>> Should not be hard to fix this. Can DSPEC magic be used for a 
>>> work-around?
>>>
>>> Paul
>>>
>>>
>>>
>>>
>>> _______________________________________________
>>> Lisp Hug - the mailing list for LispWorks users
>>> [email protected]
>>> http://www.lispworks.com/support/lisp-hug.html
>

_______________________________________________
Lisp Hug - the mailing list for LispWorks users
[email protected]
http://www.lispworks.com/support/lisp-hug.html
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.