login  home  contents  what's new  discussion  bug reports     help  links  subscribe  changes  refresh  edit

On March 10, 2006 10:53 PM Donald J Bindner wrote:

I'm trying to learn a bit about compiling packages for Axiom, so I chose a small task to cut my teeth on. I want to implement for myself a simpler simpson() function that does numerical integration.

I've got a working package after browsing through numquad.spad. However the prototype for my function is:

 simpson( Float->Float, Segment Float )

So I can perform calculations like:

 simpson( x +-> 1/x, 1..2 )

However I'd like to use a syntax more similar to the way integrate() works. I'd prefer to be able to execute:

 simpson( 1/x, x=1..2 )

I've done a lot of browsing, but I can't figure out how this is done.

I've tried to distill the core of my question into a small example package. It contains two simple() functions. One works fine, but the other won't compile. Suggestions would be welcome.

)abbrev package DONSIMP donSimple
-- Exports simple() function which takes 2 args, -- Working behavior is: simple( x+->x^2, 1..2 ) = 3.0 -- Not working but intended behavior is: -- simple( x^2, x=1..2 ) = 3.0 --
donSimple(): Exports == Implementation where F ==> Float SF ==> Segment F EF ==> Expression F SBF ==> SegmentBinding F
Exports ==> with simple : (F->F,SF) -> F simple : (EF,SBF) -> EF
Implementation ==> add simple(func:F->F, sf:SF ) == a : F := lo(sf) b : F := hi(sf) func(b) - func(a)
simple(func:EF, sbf:SBF) == a : F := lo(segment(sbf)) b : F := hi(segment(sbf)) x : Symbol := variable(sbf) eval(func, kernel(x), b::EF) - eval(func, kernel(x), a::EF)
   Compiling FriCAS source code from file 
      using old system compiler.
   DONSIMP abbreviates package donSimple 
   initializing NRLIB DONSIMP for donSimple 
   compiling into NRLIB DONSIMP 
   compiling exported simple : (Float -> Float,Segment Float) -> Float
****** comp fails at level 3 with expression: ******
error in function simple 
(SEQ (|:=| (|:| |a| (|Float|)) | << | (|lo| |sf|) | >> |) (|:=| (|:| |b| (|Float|)) (|hi| |sf|)) (|exit| 1 (- (|func| |b|) (|func| |a|)))) ****** level 3 ****** $x:= (lo sf) $m:= $EmptyMode $f:= ((((|a| #) (|sf| # . #1=#) (|func| # #) (|sf| . #1#) ...)))
>> Apparent user error: NoValueMode is an unknown mode

There are no library operations named simple Use HyperDoc Browse or issue )what op simple to learn if there is any operation containing " simple " in its name.
Cannot find a definition or applicable library operation named simple with argument type(s) Fraction(Polynomial(Integer)) SegmentBinding(PositiveInteger)
Perhaps you should use "@" to indicate the required return type, or "$" to specify which version of the function you need.

  Subject:   Be Bold !!
  ( 14 subscribers )  
Please rate this page: