From: Dan S. <dv...@ea...> - 2007-01-17 23:02:05
|
#| There is a bug in #'COERCE as demonstrated below .... I'm running SBCL on a MacBook Pro with Mac OS X.4.8. I had downloaded the Mac OS X Intel binary for SBCL 1.0. |# ~/Active/ttsl: sbcl This is SBCL 1.0, an implementation of ANSI Common Lisp. More information about SBCL is available at <http://www.sbcl.org/>. SBCL is free software, provided as is, with absolutely no warranty. It is mostly in the public domain; some portions are provided under BSD-style licenses. See the CREDITS and COPYING files in the distribution for more information. * (listp '(((16 272) ((0 1 7 2 10 9) (6 3 5 8 4 11)) ((11 4 8 5 3 6) (9 10 2 7 1 0))) ((17 21 25) ((1 2 8 3) (5 6 0 7) (9 10 4 11)) ((11 10 0 5) (3 2 4 9) (7 6 8 1)) ((9 6 4 7) (1 10 8 11) (5 2 0 3))))) T * (coerce '(((16 272) ((0 1 7 2 10 9) (6 3 5 8 4 11)) ((11 4 8 5 3 6) (9 10 2 7 1 0))) ((17 21 25) ((1 2 8 3) (5 6 0 7) (9 10 4 11)) ((11 10 0 5) (3 2 4 9) (7 6 8 1)) ((9 6 4 7) (1 10 8 11) (5 2 0 3)))) 'array) debugger invoked on a SIMPLE-TYPE-ERROR: (((16 272) ((0 1 7 2 10 9) (6 3 5 8 4 11)) ((11 4 8 5 3 6) (9 10 2 7 1 0))) ((17 21 25) ((1 2 8 3) (5 6 0 7) (9 10 4 11)) ((11 10 0 5) (3 2 4 9) (7 6 8 1)) ((9 6 4 7) (1 10 8 11) (5 2 0 3)))) can't be converted to type ARRAY. Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL. restarts (invokable by number or by possibly-abbreviated name): 0: [ABORT] Exit debugger, returning to top level. ((FLET SB-IMPL::COERCE-ERROR)) 0] ; This is my workaround -- rewrite #'COERCE .... * (defun coerce-array (s) ; SBCL workaround (let ((a (make-array (length s)))) (dotimes (i (length s) a) (setf (aref a i) (pop s))))) COERCE-ARRAY * (coerce-array '(((16 272) ((0 1 7 2 10 9) (6 3 5 8 4 11)) ((11 4 8 5 3 6) (9 10 2 7 1 0))) ((17 21 25) ((1 2 8 3) (5 6 0 7) (9 10 4 11)) ((11 10 0 5) (3 2 4 9) (7 6 8 1)) ((9 6 4 7) (1 10 8 11) (5 2 0 3))))) #(((16 272) ((0 1 7 2 10 9) (6 3 5 8 4 11)) ((11 4 8 5 3 6) (9 10 2 7 1 0))) ((17 21 25) ((1 2 8 3) (5 6 0 7) (9 10 4 11)) ((11 10 0 5) (3 2 4 9) (7 6 8 1)) ((9 6 4 7) (1 10 8 11) (5 2 0 3)))) ; ----------------------- ; Now my whole program works. Just don't ask me to explain it ; right now. Take some group theory courses first. The following ; calls my other stuff. * (defun merged-cms (spacing &rest cms) (let ((a (coerce-array cms)) stash) ; <---- workaround (apply #'stacked-cms (dotimes (i (length a) (nreverse stash)) (push (spaced-cm i spacing (aref a i)) stash))))) MERGED-CMS * (type-cm (merged-cms '(0 1 0 1 1) cm1 (transformed-cm 17 cm2))) p 0172A9 - B48536 - - R 63584B - 9A2710 - - T1 - 1283 - BA05 9647 T5 - 5607 - 3249 1A8B T9 - 9A4B - 7681 5203 NIL * |
From: Juho S. <js...@ik...> - 2007-01-17 23:21:16
|
Dan Starr <dv...@ea...> writes: > #| There is a bug in #'COERCE as demonstrated below .... [...] > * (coerce '(((16 272) ((0 1 7 2 10 9) (6 3 5 8 4 11)) > ((11 4 8 5 3 6) (9 10 2 7 1 0))) > ((17 21 25) ((1 2 8 3) (5 6 0 7) (9 10 4 11)) > ((11 10 0 5) (3 2 4 9) (7 6 8 1)) > ((9 6 4 7) (1 10 8 11) (5 2 0 3)))) 'array) > > debugger invoked on a SIMPLE-TYPE-ERROR: It's not a bug, COERCE doesn't work with arbitrary type specifiers. See http://www.lisp.org/HyperSpec/Body/fun_coerce.html for the rules on what may be coerced, and what may not. In particular, note that ARRAY is not a subtype of SEQUENCE. Maybe you meant to coerce to VECTOR? -- Juho Snellman |
From: Pascal B. <pj...@in...> - 2007-01-17 23:23:21
|
Dan Starr writes: > #| There is a bug in #'COERCE as demonstrated below .... > I'm running SBCL on a MacBook Pro with Mac OS X.4.8. I had download= ed > the Mac OS X Intel binary for SBCL 1.0. |# I'm not sure that's a bug. How could coerce guess what kind of array you mean? Here is what CLHS says when the datum is a SEQUENCE (a LIST is a SEQUENCE): If the result-type is a recognizable subtype of list, and the=20 object is a sequence, then the result is a list that has the=20 same elements as object. Ok, ARRAY is not a subtype of LIST so the above doesn't apply. =20 If the result-type is a recognizable subtype of vector, and the=20 object is a sequence, then the result is a vector that has the=20 same elements as object. If result-type is a specialized type, the result has an actual array element type that is the result of upgrading the element type part of that specialized type. If no element type is specified, the element type defaults to t. If the implementation cannot determine the element type, an error is signaled. Then ARRAY is not a subtype of VECTOR either, so the above doesn't apply. The other case that could apply is when the datum is of type T, but the only result-type specified is T: Any object can be coerced to an object of type t. In this case, the object is simply returned. So CLHS doesn't say anything about coercing a list to an array. An implementation may do whatever it wants. And if it considers that the coersion is not possible, then this sentence from the exceptional situation section applies: If a coercion is not possible, an error of type type-error is signaled. > * (coerce '(((16 272) ((0 1 7 2 10 9) (6 3 5 8 4 11)) > ((11 4 8 5 3 6) (9 10 2 7 1 0))) > ((17 21 25) ((1 2 8 3) (5 6 0 7) (9 10 4 11)) > ((11 10 0 5) (3 2 4 9) (7 6 8 1)) > ((9 6 4 7) (1 10 8 11) (5 2 0 3)))) 'array) >=20 > debugger invoked on a SIMPLE-TYPE-ERROR: SIMPLE-TYPE-ERROR is a subclass of TYPE-ERROR, so SBCL is conformant here= . You have actually two ways to do what you want, depending on what you want: - if you want to coerce to a VECTOR, then give a VECTOR type: S/CL-USER[6]> (coerce '(((16 272) ((0 1 7 2 10 9) (6 3 5 8 4 11)) ((11 4 8 5 3 6) (9 10 2 7 1 0))) ((17 21 25) ((1 2 8 3) (5 6 0 7) (9 10 4 11)) ((11 10 0 5) (3 2 4 9) (7 6 8 1)) ((9 6 4 7) (1 10 8 11) (5 2 0 3)))) 'vector) #(((16 272) ((0 1 7 2 10 9) (6 3 5 8 4 11)) ((11 4 8 5 3 6) (9 10 2 7 1 0))) ((17 21 25) ((1 2 8 3) (5 6 0 7) (9 10 4 11)) ((11 10 0 5) (3 2 4 9) (7 6 8 1)) ((9 6 4 7) (1 10 8 11) (5 2 0 3)))) - if you want to make an ARRAY with the data from the list as contents, then make an array: S/CL-USER[14]> (make-array (list 2 4) :element-type 'list ; showing why coerce cannot make=20 :adjustable nil ; an array: there are a lot of :fill-pointer nil ; additionnal parameter to make one. :initial-contents '(((16 272) ((0 1 7 2 10 9) (6 3 5 8 4 11)) ((11 4 8 5 3 6) (9 10 2 7 1 0)) ()) ;; adding an element here to have a 2D array. ((17 21 25) ((1 2 8 3) (5 6 0 7) (9 10 4 11)) ((11 10 0 5) (3 2 4 9) (7 6 8 1)) ((9 6 4 7) (1 10 8 11) (5 2 0 3))))) #2A(((16 272) ((0 1 7 2 10 9) (6 3 5 8 4 11)) ((11 4 8 5 3 6) (9 10 2 7 1 0)) NIL) ((17 21 25) ((1 2 8 3) (5 6 0 7) (9 10 4 11)) ((11 10 0 5) (3 2 4 9) (7 6 8 1)) ((9 6 4 7) (1 10 8 11) (5 2 0 3)))) --=20 __Pascal Bourguignon__ http://www.informatimago.com/ You never feed me. Perhaps I'll sleep on your face. That will sure show you. |