Hi,
I have a program which takes a mathematical expression for a polynomial and converts it to an equivalent polynomial of the form:
(+ (* ... ) (* ... ) (* ... ) )
where the .... contain only numbers and/or symbols. e.g.
(* (+ A B) (- A B) ) gets converted to (+ (* A A) (* -1 B B))
Once in this "canonical" form I process the polynomial to produce a new function that returns the coefficients of the polynomial for a particular symbol. e.g.
(do-polynomial-coefficients-function 'b '(a) '(+ (* A A) (* -1 B B) )
(LAMBDA (A) (LIST -1 ; (* -1 (expt B 2) ) 0 ; (* 0 (expt B 1) ) (+ (* A A))))
The list of coefficients can then be used to find the roots of the polynomial i.e. what are the values of B for which (zerop (* (+ A B) (- A B)) is true.
The reason I wrote the expander is for the following 6th degree polynomial where I thought I would make more mistakes doing it by hand.
(canonical-polynomial-coefficients-function t-value (a b c d f1 f2)
(- (* t-value (expt (+ (expt (+ (* a t-value) b) 2.0) (* (expt f2 2) (expt (+ (* c t-value) d) 2))) 2)) (* (- (* a d) (* b c)) (expt (+ 1 (* f1 f1 t-value t-value)) 2) (+ (* a t-value) b) (+ (* c t-value) d))))
The aspect I like most about "code is data", is the polynomial above is exactly as written in the text book. It is easy for me to check that it is right, it is also easy to document and think of the amount of paper I didn't need to use.
Mark
On 05/09/2010, at 10:24 PM, Kazimir Majorinc wrote:
As first, good luck with this list!
I'm in search for best examples of "code is data" paradigm in Common Lisp. For most CL-ers, it probably means "macros", but eval, backquote, anything that processes the code as data is of interest. As "best" I think on the most surprising, powerful, sophisticated examples, not necessarily of a pedagogical value.
Imagine that someone invited you to write the presentation "Five best CL macros ... I seen" or "Five best CL macros ... I wrote." What would you chose and why?
Kazimir Majorinc
pro mailing list pro@common-lisp.net http://common-lisp.net/cgi-bin/mailman/listinfo/pro