From: Christophe R. <cs...@ca...> - 2004-09-27 17:03:17
|
David Lichteblau <da...@li...> writes: > the following happens with 0.8.13.77.character.32: > > CXML(16): (deftype test () 'string) > > TEST > CXML(17): (concatenate 'test "foo" "bar") > > debugger invoked on a SIMPLE-TYPE-ERROR in thread 6411: > STRING is too hairy for sequence functions. I believe this is not a bug. (The error message is definitely bad, and it's possible that we should be lenient and accept this, but I don't think that it is defined to work.) From the page for CONCATENATE: If the result-type is a subtype of vector, then if the implementation can determine the element type specified for the result-type, the element type of the resulting array is the result of upgrading that element type; or, if the implementation can determine that the element type is unspecified (or *), the element type of the resulting array is t; otherwise, an error is signaled. STRING is not, in general, a fully-determined type; even in mainline CVS, it is a union of (VECTOR NIL) and (VECTOR CHARACTER), and even in mainline your test doesn't work. Why does (concatenate 'string "foo" "bar") work, then? Well, under "System Class STRING", it is specified that STRING means (VECTOR CHARACTER) when used as an argument to sequence creating functions (such as CONCATENATE). So we special-case the string symbol. In case this motivates you to ask for your TEST type to be likewise recognized, consider what you would expect to happen with (deftype test2 () '(or (vector nil) (vector character))) (concatenate 'test2 "foo" "bar"). Cheers, Christophe |