Hi Dean,
I see a lot of confusion about 'let' and perhaps also 'setq'.

## Advertising

I don't know how to better explain it as it is already done in the function
references. So I just put a few comments here; please try to understand how
exactly these functions work!
> (dm ln_completes> (Ln Ln_no)
> (let (Ln Ln Res 0)
This "Ln Ln" is a no-op. The variable 'Ln' is already bound as a parameter and
thus is already local. Instead, just do
(let Res 0
> (if (gt0 (: first_ln_no))
> (let Ln (pack " " Ln)))
This has no effect. You bind 'Ln' again, to the result of the 'pack', but this
value is discarded because the body of the 'let' is empty.
> (if (<> (: new_buf) NIL)
You never need to compare to NIL! Instead do
(if (: new_buf)
> (=: buf (: new_buf))
> (=: buf (: hdngs)))
> (if (member Ln (: buf))
> (prog
> (if (gt0 (: first_ln_no))
> (let Res (: first_ln_no))
> (let Res Ln_no))
Again, two empty 'lets' which have no effect at all.
> (reset> This)
> (let Res Res))
Same
> (prog #not a member
> (=: new_buf (fltr_mtchng_hdng_rmndrs Ln))
> (if (<> (: new_buf) NIL)
Again as above
> (if (=0 (: first_ln_no))
> (=: first_ln_no Ln_no))
> (reset> This))
> (let Res 0)))))
No effect again, so the result is NIL (= the return value of empty 'let's).
> Here's the original "setq" method
>
> (dm ln_completes> (Ln Ln_no)
> (if (gt0 (: first_ln_no))
> (setq Ln (pack " " Ln)))
> (if (<> (: new_buf) NIL)
> (=: buf (: new_buf))
> (=: buf (: hdngs)))
> (if (member Ln (: buf))
> (prog
> (if (gt0 (: first_ln_no))
> (setq Res (: first_ln_no))
> (setq Res Ln_no))
> (reset> This)
> (setq Res Res))
> (prog #not a member
> (=: new_buf (fltr_mtchng_hdng_rmndrs Ln))
> (if (<> (: new_buf) NIL)
> (if (=0 (: first_ln_no))
> (=: first_ln_no Ln_no))
> (reset> This))
> (setq Res 0))))
This has the same issues with the comparison with NIL. Besides this, it writes
to the free variable 'Res', which might destroy its value in other functions.
I don't know why you are so obsessed with 'setq' ;)
The only place where it is good is the line (setq Ln (pack " " Ln)). For the
rest all 'setq's can be simply omitted if you fix the conditional flow.
Try it! :)
If you e.g. want to return 0 at the end, why don't you just write 0 instead of
(setq Res 0), assigning the value to a variable?
♪♫ Alex
--
UNSUBSCRIBE: mailto:picolisp@software-lab.de?subject=Unsubscribe