[iterate-devel] problem with maybe-quoted
Hi! I'm experimenting with iterate and wanted to use it for a simple sequence splitting function (yeah, I know about the SPLIT-SEQUENCE lib): (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? Best regards, Vsevolod
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
participants (2)
-
Hoehle, Joerg-Cyril
-
Vsevolod