From: SourceForge.net <no...@so...> - 2012-03-27 14:47:05
|
Bugs item #3510983, was opened at 2012-03-25 02:57 Message generated for change (Comment added) made by robert_dodier You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=104933&aid=3510983&group_id=4933 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: Lisp Core Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: Volker van Nek (van_nek) Assigned to: Nobody/Anonymous (nobody) Summary: curious evaluation in ifactor.lisp Initial Comment: With clisp and sbcl: (%i1) load("/home/volker/Maxima/git/maxima/src/ifactor.lisp")$ (%i2) :lisp (get-factor-list 15) ((5 1) (3 1)) (%i2) :lisp (let* ((fs (get-factor-list 14)) (f (car fs))) (incf (cadr f) 41)) 42 (%i2) :lisp (get-factor-list 15) ((5 42) (3 1)) Each call to get-factor-list should cons a new list, so each return value should be referentially independent. I tried to find the reason of this error and observed that in ifactor.lisp lines 223-226 (when (> (* d d) n) (push `(,n 1) factors) (when $ifactor_verbose (format t "small prime cofactor: ~A~%" n)) (return-from get-small-factors (values 1 factors))) the backquote-comma-macro-line seems to cause this. Using (push (list n 1) factors) or (setq tmp 1) (push `(,n ,tmp) factors) instead the results are as expected. I don't get the clue what's wrong with (push `(,n 1) factors). If I create a new list foo with (copy-tree factors) inside of get-small-factors and do (push `(,n 1) foo) the results for foo are as expected. So I guess the variable 'factors' has referential problems. Don't know why. ---------------------------------------------------------------------- >Comment By: Robert Dodier (robert_dodier) Date: 2012-03-27 07:47 Message: I think you should just go ahead and change the code. Looks to me like you have identified a problem and a way to fix it, so I think you should ahead and fix it. ---------------------------------------------------------------------- Comment By: Volker van Nek (van_nek) Date: 2012-03-25 03:12 Message: (setq foo (copy-tree factors)) isn't even necessary. (setq foo factors) or (setf foo factors) also works: (when (> (* d d) n) (setf foo factors) (print foo) (push `(,n 1) foo) (print foo) (print factors) (push `(,n 1) factors) (print factors) prints (%i2) :lisp (get-factor-list 15) ((3 1)) ((5 1) (3 1)) ((3 1)) ((5 42) (3 1)) <- print ((5 42) (3 1)) <- return value ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=104933&aid=3510983&group_id=4933 |