Hi,
Vsevolod wrote:
>(defun split (seq pred)
> (iter (for el in-sequence seq)
> (if (funcall pred el)
> (collect el into sat result-type (type-of seq))
> (collect el into nsat result-type (type-of seq)))
> (finally (return (values sat nsat)))))
>
>But such a construct won't work because result-type is recognized as a
>literal (not evaluated). I think it's rather a bug, than a feature,
>because this somewhat inhibits the possibilities of programmatic
>extension of the ITER macro. Isn't it?
To make such a statement, you have to come up with a better example.
Your DEFUN knows nothing about the type of the SEQ parameter which will
be supplied at run-time, so how do you expect Iterate to do something
particular depending on the type?
Iterate's design is to produce code at macroexpansion-time. (TYPE-OF
seq) inside DEFUN yields a type at run-time -- too late.
Generally, in CL forms, you'll see types not evaluated. Years ago, KMP
had a good posting about this topic in comp.lang.lisp.
BTW, Iterate's RESULT-TYPE does nothing more than a COERCE, so you could
just add it yourself. Or, if you don't like the presumable waste in
COERCE, write a TYPECASE for the few types where you expect that to make
a difference, and then do not forget to perform some benchmarking.
Regards,
Jorg Hohle
_______________________________________________
iterate-devel site list
[email protected]
http://common-lisp.net/mailman/listinfo/iterate-devel