freenode/#abcl - IRC Chatlog
Search
11:53:17
letest1
Hi, I spent another 20 minutes testing the integration java/abcl. Now I read from an external file. I define two function, ONE (which returns "one") and TWO (which returns "two") and end the file calling (two). With my surprise the result of interpreter.eval(lispCode) is 'ONE' (the name of the function, not its return value), while I expected it to be "two" (the return value of the function TWO).
11:54:39
no-defun-allowed
My first guess is that you put all the definitions in one string, ABCL read the first expression and evalled it, and then dropped the rest.
11:55:31
no-defun-allowed
In which case, I would put one expression per .eval call, and the last one will have the value you want.
11:57:11
letest1
But then the Java code has to know how the lisp code is formatted. It's not very maintainable...
11:58:23
no-defun-allowed
Expressions are expressions regardless of formatting, but I get your point.
11:59:10
letest1
also, if there is an error in the expression, the thread gets locked in the ABCL repl.
12:06:28
letest1
(anyway, I pushed the code: https://github.com/TristanoSuriani/abcl-test/blob/master/src/main/java/nl/tsuriani/AbclTestResource.java and https://github.com/TristanoSuriani/abcl-test/blob/master/src/main/resources/test.lisp
12:35:08
robertm
I don't have time to look at the code, and I don't know much about java/lisp integration, and I'm about to be AFK, but I do have time to suggest that you can convert multiple expressions into a single expression by putting them inside PROGN, e.g. "(progn (defun one () 1) (defun two () (+ (one) (one))) (two))".
13:36:21
pjb
letest1: if as I assume, it's a String, then interpreter.eval must be reading the string into a sexp. In that case, it will read only one sexp. So robertm's suggestion is the right one, you should wrap everything in a single progn to have only ine sexp in the string.
13:38:17
pjb
letest1: another thing would be to use LIST instead of PROGN, to get the values of each expression in lispCode.
14:11:43
letest1
@pjb, thanks. The value of lispCode is indeed String. I'm going to have a coffee and try with wrapping progn to lispCode.
15:30:20
letest1
(load "file.lisp") tries to load a file from the project root /target directory. So typical Java. So to make it seamlessly load a file located in the same folder I have to copy all the lisp files in the target directory with a Maven plugin.
15:54:57
pjb
letest1: what's the current value? (setf *default-pathname-defaults* #P"./") should use the current working directory. But I don't know if that means "same folder". What do you mean by "same folder"?
15:56:48
pjb
letest1: if you want to load files from another file, then first you should consider using asdf.
15:57:15
pjb
letest1: but if this is really what you want to do, you can use *load-pathname* (or *load-truename*).
15:58:06
pjb
(load (merge-pathnames "file.lisp" (or *load-pathname* (error "You should load this file, not just evaluate the form."))))
16:11:10
letest1
thanks @pjb. What I want to do is to define an "index.lisp" file where I load a number of lisp files and retrieve the value of a certain expression that depends on the other files. So, after building the project with Java, it copies the lisp source files under "target/classes/abcl".
16:13:25
letest1
Now all the source files are at runtime under "target/classes/abcl". But if I load file1.lisp from file2.lisp with (load "file1.lisp"), it throws a 'file not found' error'. That is because it tries to load from target and not from target/classes/abcl.
16:15:57
letest1
I can of course write a function then adds "classes/abcl" to the given file name and calls load. But if there are more elegant options, I listen.
17:15:38
pjb
You could (let ((*default-pathname-defaults* #P"classes/abcl/")) (mapc 'load '("file2" "file3" …)))