Re: E/R question

2014-03-25 Thread Alexander Burger
Hi David,

> What would you recommend I do to store a list of 3 values as the value of a
> relation in a class?  A class for the list of 3 values or some other better
> way?
> 
> (class +ALH +Entity)
> (rel actual (+Need +Number)) # Actual value
> (rel lo (+Need +Number))   # Low value
> (rel hi (+Need +Number))   # High value
> ...
> (class +Scores +Entity)
> (rel round1 (+Need +ALH))  # Round 1
> (rel round2 (+Need +ALH))  # Round 2
> (rel round3 (+Need +ALH))  # Round 3

The "natural" way is the '+List' relation in combination with '+Bag',
defining a two-dimensional list:

   (class +Scores +Entity)
   (rel rnd (+List +Bag)# Rounds
  ((+Number) 2)# Actual value
  ((+Number) 2)# Low value
  ((+Number) 2) )  # High value

Advantages are that the list is not limited in length, and that it
directly maps to the GUI with a +Chart:

   (gui '(+E/R +Chart) '(rnd : home obj) 5)
   ( NIL NIL
  '((NIL "Actual") (NIL "Low") (NIL "High"))
  (do 8
 ( NIL
(gui 1 '(+FixField) 2 10)# Actual value
(gui 2 '(+FixField) 2 10)# Low value
(gui 3 '(+FixField) 2 10)# High value
(gui 4 '(+DelRowButton)) # Delete-row button
(gui 5 '(+BubbleButton)) ) ) )   # Bubble-button
   (scroll 8 T)


> Then use a helper function as sugar when creating a +Scores object:
> (de new-ALH (actual lo hi)
>(new '(+ALH) 'actual actual 'lo lo 'hi hi) )

Note that this is not quite correct. Calling 'new' in this way will
create an object in memory, not a DB object. You probably meant

   (new (db: +ALH) '(+ALH) ...

or

   (new! '(+ALH) ...


With the above model, you could do (assuming a '*Scl' of 2):

   (new! '(+Scores) 'rnd '((2.0 0.0 3.0) (4.0 1.0 7.0)) ...)


At runtime, you can also set the 'rnd' value either completely

   (put!> MyScores 'rnd '((2.0 0.0 3.0) (4.0 1.0 7.0) ...))

or partially

   (put!> MyScores 'rnd (4.0 1.0 7.0))

In the second case the +Bag will take care of 'cons'ing the
one-dimensional list into the two-dimensional bag.


> this.  Also, how could I handle floats rather than integers, say to two
> places?  With the format function?  Thank you in advance for your help.

Yes. Internally it all boils down to 'format'. An E/R definition like

   (rel x (+Number) 2)

tells the system that you expect a scaled integer with two decimal
places, but it is the programmer's duty to take care of it, i.e. using
the right '*Scl' for the reader, and GUI components like

   (gui '(+FixField) 2 10)
 ^
to handle the formatting.

♪♫ Alex
-- 
UNSUBSCRIBE: mailto:picolisp@software-lab.de?subject=Unsubscribe


E/R question

2014-03-24 Thread me
Hello List,

What would you recommend I do to store a list of 3 values as the value of a
relation in a class?  A class for the list of 3 values or some other better
way?

(class +ALH +Entity)
(rel actual (+Need +Number)) # Actual value
(rel lo (+Need +Number))   # Low value
(rel hi (+Need +Number))   # High value

(dm T (Actual Lo Hi)
   (:= actual Actual)
   (:= lo Lo)
   (:= hi Hi) )


(class +Scores +Entity)
(rel round1 (+Need +ALH))  # Round 1
(rel round2 (+Need +ALH))  # Round 2
(rel round3 (+Need +ALH))  # Round 3

(dm T (Round1 Round2 Round3)
   (:= round1 Round1)
   (:= round2 Round2)
   (:= round3 Round3) )


Then use a helper function as sugar when creating a +Scores object:
(de new-ALH (actual lo hi)
   (new '(+ALH) 'actual actual 'lo lo 'hi hi) )

(new '(+Scores) 'round1 (new-ALH 2 0 5) 'round2 (new-ALH 1 0 5) 'round3
(new-ALH 5 0 5) )


I feel like there's a much simpler way or a more idiomatic method to do
this.  Also, how could I handle floats rather than integers, say to two
places?  With the format function?  Thank you in advance for your help.

Warm regards,
David Bloom