On Mon, Apr 11, 2011 at 9:37 AM, Ron Garret <span dir="ltr"><<a href="mailto:ron@flownet.com">ron@flownet.com</a>></span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">

But because you're dealing with keyword arguments, they are already optional.  So you can do your own dispatching:<br>
<div class="im"><br>
(cl:defmethod initialize-instance :after ((obj Vlad) &key (a cl:integer) (d cl:number))<br>
</div>  (cond ((and a b)<br>
              (setf (slot-value obj 'ff-pointer) (new_Vlad__SWIG_0 a d))))<br>
             ((not (or a b))<br>
              (setf (slot-value obj 'ff-pointer) (new_Vlad__SWIG_1))))<br>
             (a (error "A specified but B isn't"))<br>
             (b (error "B specified but A isn't")))))<br></blockquote><div><br>Thank you Ron. You example code was very helpful, and I'm glad you pointed out that the type of the arguments was being used to provide default values, and not to do dispatch.<br>
<br>I have a working implementation for overloaded constructors now.  (Yes!  =)  I followed your suggestion and formed the union of all the names of arguments to overloaded constructors, and then dispatch to each constructor based on the keyword arguments provided.  An example of the generated code is below.<br>
<br>One drawback to this approach is that the person writing to the new Lisp interface now *must* provide keyword arguments. It would be nice to not require this when it is redundant.<br><br>Q: Would it be possible to dispatch from initailize-instance from the *arity* and/or *the types* of the arguments alone?<br>
<br><br>Thanks!<br>Jason<br><br><br>// current keyword overload way:<br><br>// the C++ class with overloaded constructor:<br>struct FileName<br>{<br>  FileName(char *str, int ref);<br>  FileName(char *path, char *name);<br>
};<br><br><br>; the auto-generated Lisp init-instance code:<br><br>(cl:defmethod initialize-instance<br>     :after ((obj FileName)<br>             &key<br>             (name)<br>             (path)<br>             (ref)<br>
             (str)<br>             )<br>    (cond ((and            ref str ;; <- *required*  keyword param<br>           (and (not (or   name path ;; <- *forbidden* keyword param<br>                                                ))))<br>
           (setf (slot-value obj 'ff-pointer)  (new_FileName__SWIG_0  str ref)))<br><br>          ((and            name path ;; <- *required*  keyword param<br>           (and (not (or   ref str ;; <- *forbidden* keyword param<br>
                                                ))))<br>           (setf (slot-value obj 'ff-pointer)  (new_FileName__SWIG_1  path name)))<br><br>          (t (error "no C++ constructor for class 'FileName' matched your combination of keyword parameters"))))<br>
<br> <br></div></div>