Generating octave functions from maxima



Hello.

Thank You for the change, I build from source and it works.

Pawel Szklarz.

2012/2/23 Robert Dodier <robert.dodier at gmail.com>:
> On 2/8/12, Pawe? Cesar Sanjuan Szklarz <paweld2 at gmail.com> wrote:
>
>> My question is: ?how to generate dq(i) in stand of dq(1,i)?? I am
>> using f90mx inside generateOctaveFunction.
>
> I've committed the following changes to f90mx and fortmx,
> so now assignments to a 1-dimensional array are generated
> when the argument is a list (which caused an error before).
> A matrix is treated the same as before. In particular, no attempt
> is made to treat a 1-row or 1-column matrix as 1-dimensional.
>
> You can apply this patch to your local Maxima installation,
> or you can wait for the next release (sometime in April).
>
> Hope this helps,
>
> Robert Dodier
>
>
> PS.
> $ git diff d3f131579^..d3f131579
> diff --git a/share/contrib/f90.lisp b/share/contrib/f90.lisp
> index 6c80b1e..4a0ce80 100644
> --- a/share/contrib/f90.lisp
> +++ b/share/contrib/f90.lisp
> @@ -90,26 +90,34 @@
> ?;; Takes a name and a matrix and prints a sequence of F90 assignment
> ?;; statements of the form
> ?;; ?NAME(I,J) = <corresponding matrix element>
> +;; or, when the second argument is a list,
> +;; ?NAME(I) = <list element>
>
> ?(defmfun $f90mx (name mat)
> ? (cond ((not (symbolp name))
> - ? ? ? ?(merror "~%First argument to `f90mx' must be a symbol."))
> - ? ? ? ((not ($matrixp mat))
> - ? ? ? ?(merror "Second argument to `f90mx' not a matrix: ~M" mat)))
> - ?(do ((mat (cdr mat) (cdr mat)) (i 1 (1+ i)))
> - ? ? ?((null mat))
> - ? ?(do ((m (cdar mat) (cdr m)) (j 1 (1+ j)))
> - ? ? ? ((null m))
> - ? ? ?(f90-print `((mequal) ((,name) ,i ,j) ,(car m)))))
> + ? ? ? ?(merror "f90mx: first argument must be a symbol; found: ~M" name))
> + ? ? ? ((not (or ($matrixp mat) ($listp mat)))
> + ? ? ? ?(merror "f90mx: second argument must be a list or matrix;
> found: ~M" mat)))
> + ?(cond
> + ? ?(($matrixp mat)
> + ? ? (do ((mat (cdr mat) (cdr mat)) (i 1 (1+ i)))
> + ? ? ? ((null mat))
> + ? ? ? (do ((m (cdar mat) (cdr m)) (j 1 (1+ j)))
> + ? ? ? ? ((null m))
> + ? ? ? ? (f90-print `((mequal) ((,name) ,i ,j) ,(car m))))))
> + ? ?(($listp mat)
> + ? ? (do ((mat (cdr mat) (cdr mat)) (i 1 (1+ i)))
> + ? ? ? ((null mat))
> + ? ? ? (f90-print `((mequal) ((,name) ,i) ,(car mat))))))
> ? '$done)
>
> ?(defmspec $f90 (expr)
> ? (dolist (l (cdr expr))
> ? (let ((value (strmeval l)))
> ? ? (cond ((msetqp l) (setq value `((mequal) ,(cadr l) ,(meval l)))))
> - ? ?(cond ((and (symbolp l) ($matrixp value))
> + ? ?(cond ((and (symbolp l) (or ($matrixp value) ($listp value)))
> ? ? ? ? ? ($f90mx l value))
> ? ? ? ? ?((and (not (atom value)) (eq (caar value) 'mequal)
> - ? ? ? ? ? ? ? (symbolp (cadr value)) ($matrixp (caddr value)))
> + ? ? ? ? ? ? ? (symbolp (cadr value)) (or ($matrixp (caddr value))
> ($listp (caddr value))))
> ? ? ? ? ? ($f90mx (cadr value) (caddr value)))
> ? ? ? ? ?(t (f90-print value))))))
> diff --git a/src/fortra.lisp b/src/fortra.lisp
> index 21da838..847a3e1 100644
> --- a/src/fortra.lisp
> +++ b/src/fortra.lisp
> @@ -30,17 +30,17 @@
> ?(defmvar $fortfloat nil "Something JPG is working on.")
>
> ?;; This function is called from Macsyma toplevel. ?If the argument is a
> -;; symbol, and the symbol is bound to a matrix, then the matrix is printed
> +;; symbol, and the symbol is bound to a matrix or list, then the
> value is printed
> ?;; using an array assignment notation.
>
> ?(defmspec $fortran (l)
> ? (setq l (fexprcheck l))
> ? (let ((value (strmeval l)))
> ? ? (cond ((msetqp l) (setq value `((mequal) ,(cadr l) ,(meval l)))))
> - ? ?(cond ((and (symbolp l) ($matrixp value))
> + ? ?(cond ((and (symbolp l) (or ($matrixp value) ($listp value)))
> ? ? ? ? ? ($fortmx l value))
> ? ? ? ? ?((and (not (atom value)) (eq (caar value) 'mequal)
> - ? ? ? ? ? ? ? (symbolp (cadr value)) ($matrixp (caddr value)))
> + ? ? ? ? ? ? ? (symbolp (cadr value)) (or ($matrixp (caddr value))
> ($listp (caddr value))))
> ? ? ? ? ? ($fortmx (cadr value) (caddr value)))
> ? ? ? ? ?(t (fortran-print value)))))
>
> @@ -144,17 +144,25 @@
> ?;; Takes a name and a matrix and prints a sequence of Fortran assignment
> ?;; statements of the form
> ?;; ?NAME(I,J) = <corresponding matrix element>
> +;; or, when the second argument is a list,
> +;; ?NAME(I) = <list element>
>
> ?(defmfun $fortmx (name mat &optional (stream *standard-output*) &aux
> ($loadprint nil))
> ? (cond ((not (symbolp name))
> ? ? ? ? (merror (intl:gettext "fortmx: first argument must be a
> symbol; found: ~M") name))
> - ? ? ? ((not ($matrixp mat))
> - ? ? ? ?(merror (intl:gettext "fortmx: second argument must be a
> matrix; found: ~M") mat)))
> - ?(do ((mat (cdr mat) (cdr mat)) (i 1 (1+ i)))
> - ? ? ?((null mat))
> - ? ?(do ((m (cdar mat) (cdr m)) (j 1 (1+ j)))
> - ? ? ? ((null m))
> - ? ? ?(fortran-print `((mequal) ((,name) ,i ,j) ,(car m)) stream)))
> + ? ? ? ((not (or ($matrixp mat) ($listp mat)))
> + ? ? ? ?(merror (intl:gettext "fortmx: second argument must be a list
> or matrix; found: ~M") mat)))
> + ?(cond
> + ? ?(($matrixp mat)
> + ? ? (do ((mat (cdr mat) (cdr mat)) (i 1 (1+ i)))
> + ? ? ? ((null mat))
> + ? ? ? (do ((m (cdar mat) (cdr m)) (j 1 (1+ j)))
> + ? ? ? ? ((null m))
> + ? ? ? ? (fortran-print `((mequal) ((,name) ,i ,j) ,(car m)) stream))))
> + ? ?(($listp mat)
> + ? ? (do ((mat (cdr mat) (cdr mat)) (i 1 (1+ i)))
> + ? ? ? ((null mat))
> + ? ? ? (fortran-print `((mequal) ((,name) ,i) ,(car mat)) stream))))
> ? '$done)
>
> ?;; Local Modes: