Menu

Show posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Show posts Menu

Topics - pda

#1
Whither newLISP? / Parametrized access to context
April 03, 2026, 05:57:13 AM

I'd like to know if there's some way to access to context symbols in a parametrized way, that is, passing the context or the full qualified path to context symbols.

Let's clarify the question with some examples.

If I want to create a symbol in a context (or access to it) I can just prefix the symbol with the context:

(define CTX:s 7)
(print CTX:s)

This way I can create any kind of symbol, including functions:

(define CTX:f (lambda (a) (+ 1 a)))

The problem appears with free symbols inside the function, if I use a free symbol its is resolving depending on the context prefix and assuming MAIN if no prefix:

(define CTX:g (lambda (a) (+ n a)))

What n inside CTX:g referes to?  it refers to context MAIN since it is not prefixed at all :

(setq CTX:n 66)
(setq n 1)
(CTX:g 2)   --->   3 

so, what if I want n to refer to context CTX inside CTX:g function?  I have to prefix it with CTX symbol:

(define CTX:g (lambda (a) (+ CTX:n a)))
(CTX:g 2)   --->   68 

The problem arise when I don't know the context, i.e. I don't know the context symbol so I cannot use a context prefix ,  let's say I have a function g in several contexts and I want to execute the right one depending on the context.

Fortunately newlisp allow to pass a variable as a context prefix and doing so it uses the variable value as prefix:

(define C:n 1)
(define C:g (lambda (a) (+ C:n a)))

(setq cn CTX)
(cn:g 2)      ->   68

(setq cn C)
(cn:g 2)      ->   3

And so you can define the same symbols in differente contexts provided you set previously the context, i.e. the prefix:

(setq cn C)
(define cn:X 8)
(define cn:X2 (lambda () (* cn:X 2)))

(cn:X2)    ->   16

(setq cn CTX)
(define cn:X 1)
(define cn:X2 (lambda () (* cn:X 2)))

(cn:X2)    ->   2

What to do in order to avoid setting the prefix previously each time, well you can pass it to the function:
   
(define X2 (lambda (cn) (* cn:X 2))

(X2 C)        -> 16
(X2 CTX)    -> 2

Pretty good, know I have a general function in context MAIN that use symbols in context passed as parameter.

But I want to have the function defined in the context I'm passing as parameter, not in MAIN

The obvious solution is to create a function with a context as parameter, that creates a contex with th X2 function inside:

(define (mk-ctx c) (define c:X2 (lambda (cn) (* cn:X 2))))

Now if I want the function created in context OO I call mk-ctx with that context:

(context 'OO)
(context MAIN)
(mk-ctx OO)
(OO:X2 C)       --->   16
(OO:X2 CTX)   --->   2

Pretty good, but I still have to pass the evaluation context to X2, I want X2 to use the context in which it is defined, here OO, so easy:

(define (mk-ctx c) (define c:X2 (lambda () (* c:X 2))))

But this fails, because now c:X in lambda's body uses a free variable c which is evaluated in context MAIN (where it can even be unbind)

This is better seen with this alternative definition of mk-ctx showing the value of c symbol inside the lambda:

(define (mk-ctx c) (define c:X2 (lambda () (print c) (* c:X 2))))

if I set c in MAIN context to be 9382, I can see the problem:


(setq OO:X 10)
(setq c 9382)
(mk-ctx OO)
(OO:X2)
9382
ERR: context expected in function * : MAIN:c
called from user function OO:(X2)

If I set c to a valid context in MAIN, everything is ok:

(setq c OO)
(mk-ctx OO)
(OO:X2)       --->   20
OO

So the problem is how to use in the body of lambda X2 a parametrized context WITHOUT passing it as parameter,
that is, I want that body of lambda evaluates the free variables in the context it is defined and not in main (or a passed prefix):

(define (mk-ctx c) (define c:X2 (lambda () (let (cn (context)) (* cn:X 2)))) c)

Now I can create a "autoreferenced" X2 function, and also mk-ctx returns the context in which it is defined:

(setq the-ctx (mk-ctx OO))
(the-ctx:X2)     -->  20

That is so good, but I have to take care of all that context stuff inside the body, it would be better if I can forget about context machinery
What I want is something like this:

(define (mk-ctx c) (define c:X2 (lambda () (* (my 'X) 2))) c)

But the problem is to define that my funcion, it's tempted to define it as:

(define (my v) (eval (sym v (context))))

But again the problem is the evaluation of (my 'X) is done in context MAIN and so (my v) returns the value of symbol V in MAIN, not in context of X2

Of course you can solve it by passing the context to function my, but this get us back to the begining

Another problem is to define any function in the context not just X2, but this is easy just changing the mk-ctx to:

(define (mk-ctx c f b) (define c:f b) c)

Now I can define any  function in the context:

(setq the-ctx (mk-ctx OO 'f (lambda () (let (cn (context)) (* cn:X 2))) ))
(the-ctx:f)   --> 20

(setq the-ctx (mk-ctx OO 'f (lambda () 1) ))
(the-ctx:f)   --> 1

So the problem is to define a proper my function in order to skip context machinery when defining the function body,
that is function "my" has to return the value of symbol passed in the current context when invoking the funcion f (in the previous example)
which is the contex in which function f is define (OO in the previous example)
ideally this my function not only have to get the current value of the symbol in context but also should be able to set it using setf :

(my 'v)               --->  returns the value of symbol v in context defined using mk-ctx  (current context, OO, when invoking the function f)
(setf (my 'v) 4)   --->  set the value of symbol v to 4 in context defined using mk-ctx

Any idea to define this my function or a schema to resolve symbols in current schema avoid to deal with it inside function body?


#2
Anything else we might add? / forum problems?
December 19, 2021, 01:46:20 PM
is there any problem with the forum?



every time I try to reply including quote and code I get an internal Server Error
#3
newLISP in the real world / newlisp 10 changes
November 16, 2020, 02:28:03 AM
Hello, I've read in several places, i.e. https://github.com/kanendosei/artful-newlisp">https://github.com/kanendosei/artful-newlisp , there're code that needs to be rewritten to support newlisp 10 changes



Can anybody summarizes what are the changes that need rewritting in order to comply with newlisp >= 10 ?



of course I can crawl the web but it would be nice if some one have a compiled list of changes
#4
Anything else we might add? / weirdness in newlisp
November 15, 2020, 04:02:08 PM
Hi,



I got again weird behaviour coding in newlisp.



I'm using  newLISP v.10.7.5 64-bit on Windows UTF8 libffi  using the NewLisp GS v.1.6

The downloaded zipped version  was a bit lower and then I downloaded the last exe and dll and overwrite the installed ones.



Now when I type this function in edit area of NewLisp GS or in REPL area, it is defined right:


> (define (utf8code c) (cond ((< c 128) "0xxxxxxx") ((< c 2048) "110xxxxx 10xxxxxx") ((< c 65536) "1110xxxx 10xxxxxx 10xxxxxx") ((< c 1114112) "11110xxx 10xxxxxx 10xxxxxx 10xxxxxx")))
(lambda (c)
 (cond
  ((< c 128) "0xxxxxxx")
  ((< c 2048) "110xxxxx 10xxxxxx")
  ((< c 65536) "1110xxxx 10xxxxxx 10xxxxxx")
  ((< c 1114112) "11110xxx 10xxxxxx 10xxxxxx 10xxxxxx")))


but if I add little pretty print to it, then everything goes wrong:



> (define (utf8code c)
(cond ((< c 128) "0xxxxxxx") ((< c 2048) "110xxxxx 10xxxxxx") ((< c 65536) "1110xxxx 10xxxxxx 10xxxxxx") ((< c 1114112) "11110xxx 10xxxxxx 10xxxxxx 10xxxxxx")))


ERR: missing parenthesis : "...(define (utf8code c) n"
> "0xxxxxxx"

ERR: missing parenthesis : "..."11110xxx 10xxxxxx 10xxxxxx 10xxxxxx"��e"


It seems newlisp is not able to figure out function definition is not complete because entering the REPL in command line I get:


> (define (f a)

ERR: missing parenthesis : "...(define (f a)n"


It seems like newlisp 10.7.5 only accepts one liners



Maybe is it a problem terminal not supporting unicode?   I tested with  windows cmd, windows powershell and mobaxterm (cygwin)
#5
I see there's no option to download newlisp-GS in new versions of newlisp and also don't include guiserver.lsp neither



is it deprecated in any way?
#6
Anything else we might add? / error in newlisp 10.7.1
September 25, 2020, 04:23:26 AM
sometimes newlisp 10.7.1 gets mad and is not able to parse s-expressions



I'm using newlisp-gs in windows 10 utf8 version, and sometimes when writting code in newlisp-gs editor it doen't match parenthesis properly and refuses to parse the expressions with weird error aparently related to encoding (even when typeing directly in editor!)



for example I got error like  ERR: missing parenthesis : "...oin fline ","))rn(close fo)rn(close f�F�"



the strange encoding reads (close fh) in code



same behaviour in console repl, with newlisp 10.7.1  run from windows cmd



anyone with similar problems?
#7
It should be great to add a main topic in board index to talk about bugs and weird things happening with newlisp



I don't kow of a bug tracking system for newlisp, is there any?