[comp.lang.lisp] Allegro CL bug?

friedman@porthos.rutgers.edu (Gadi ) (11/03/88)

I am using 

Allegro CL 3.0.1.beta [sun4] (7/29/88 23:05)
Copyright (C) 1985-1988, Franz Inc., Berkeley, CA, USA

and am tring to setf array values using (apply #'aref array list))

(setq test (make-array '(2 2)))  ; works
(apply #'aref test '(1 1))       ; works (returns the correct element)
(setf (apply #'aref test '(1 1)) 2) ; DOES NOT WORK.
		This should work, as described in CLtL pg 95 and 291.

It also works fine using

;;; Sun Common Lisp, Development Environment 2.1.1, 24-Jun-88
;;;
;;; Copyright (c) 1987 by Sun Microsystems, Inc.  All Rights Reserved
;;; Copyright (c) 1985, 1986, 1987 by Lucid Inc.,  All Rights Reserved

Can anyone think of a workaround.  Something short of making a
new list and using eval.  (eval (setf (aref test 1 1) 2))
will work.  (We all know how slow eval is)
-- 


uucp:   {ames, cbosgd, harvard, moss}!rutgers!aramis.rutgers.edu!friedman
arpa:   FRIEDMAN@ARAMIS.RUTGERS.EDU

hedrick@geneva.rutgers.edu (Charles Hedrick) (11/03/88)

Unless you really don't know the number of dimensions of your array in
advance, (apply #'aref array list) sounds to me like it's going to be
inefficient.  It's going to be particularly hard to produce good
compiled code for it.  I agree that apply is better than eval, but not
by that much.  At any rate, the inverse of aref in Allegro CL appears
to be excl::.inv-s-aref.  So you can probably do

  (apply #'excl::.inv-s-aref newvalue array subscript-list)

This will work until we get Franz to make (setf (apply #'aref ...
work.

layer@snooze.UUCP (Kevin Layer) (11/08/88)

++ From: friedman@porthos.rutgers.edu (Gadi )
++
++ I am using 
++ 
++ Allegro CL 3.0.1.beta [sun4] (7/29/88 23:05)
++ Copyright (C) 1985-1988, Franz Inc., Berkeley, CA, USA
++ 
++ and am tring to setf array values using (apply #'aref array list))
++ 
++ (setq test (make-array '(2 2)))  ; works
++ (apply #'aref test '(1 1))       ; works (returns the correct element)
++ (setf (apply #'aref test '(1 1)) 2) ; DOES NOT WORK.
++ 		This should work, as described in CLtL pg 95 and 291.
++ 

There is patch for this bug, which will be sent to you under separate
cover.

++ From: hedrick@geneva.rutgers.edu (Charles Hedrick)
++ 
++ Unless you really don't know the number of dimensions of your array in
++ advance, (apply #'aref array list) sounds to me like it's going to be
++ inefficient.  It's going to be particularly hard to produce good
++ compiled code for it.  I agree that apply is better than eval, but not
++ by that much.  At any rate, the inverse of aref in Allegro CL appears
++ to be excl::.inv-s-aref.  So you can probably do
++ 
++   (apply #'excl::.inv-s-aref newvalue array subscript-list)
++ 
++ This will work until we get Franz to make (setf (apply #'aref ...
++ work.

You are correct, this is the proper workaround in the absence of the
patch.

	Kevin Layer
	Franz Inc.