libera/#lisp - IRC Chatlog
Search
20:00:33
thymage
But for the `(,@lst) part, is there any way that I could do something without the () around the ,@? Like, I can't do `,@
20:03:37
thymage
The one you already see is a good example. The result should be identical to what it does as it is written, but no parentheses
20:05:10
thymage
I don't think I can do it with the open syntax like that because I don't know how to compute a unique list there.
20:07:00
thymage
So, if you write it like that, it stays written that way. But then you can put a computed list there.
20:11:45
thymage
Somehow, the type of the argument is different if you do (declare-struct v1 v2) vs the expansions we are considering
20:12:43
thymage
So, if you give the argument (list v1 v2) then it sees one argument that is a list, all of the arguments being in another argument
20:13:06
thymage
That's different. (declare-struct (v1 v2)) is different than (declare-struct v1 v2)
20:13:43
thymage
Right. A list is the result. But then a list is being passed to the original declare-struct
20:15:05
mrcom
(declare-struct '(v1 v2)) == (declare-struct (quote v1 v2)) => create a list of two elements, symbols named v1 and v2.
20:17:06
thymage
I'm trying to compute all of the arguments given to declare-struct. I cannot do with manually writing v1 v2 v3 as arguments to declare-struct.
20:17:17
mrcom
If you (defmacro declare-struct (x)), you're saying that declare-struct expects exactly one argument.
20:18:59
mrcom
Then to create a struct with multiple elements, you would need to (defconstant [or whatever] v3 (define-struct (list v1 v2)))
20:19:42
mrcom
If you define the macro as (defmacro define-struct (&rest args)) then you're saying that args is a list of 0 or more elements.
20:21:52
mrcom
The first definition of define-struct requires you to explicitly enclose multiple arguments in a list, and then explicitly peel them out in the macro body.
20:23:56
mrcom
The first method can have some advantages. It allows you include other types of parameters, especially keywords.
20:27:07
thymage
Crap dude, for the life of me I can't get the instance where I make a list to work.
20:30:00
mrcom
Oh... you need the &rest. Otherwise you have a single argument. (def-struct v1 v2) can't work, because that's two arguments.
20:30:30
mrcom
(If it looks like it's working then something is wrong. Maybe an old definition didn't get cleaned up.)
20:32:17
thymage
I'm getting the variable QUOTE is unbound when I do it that way. When I switch to (list 'v1 'v2) as argument, it then says the variable list is unbound.
20:34:04
mrcom
(declare-struct '(list v1 v2)) == (declare-struct (quote 'list 'v1 'v2)). The first element of the argument is the symbol quote (which does not have a variable value).
20:35:54
mrcom
(declare-struct (list 'v1 'v2)); the first element is the symbol "list", which doesn't have a variable value.
20:39:34
mrcom
(Notice no "@". "@" means "splice it into the enclosing list", and there's no outer list here.)
20:42:57
thymage
I'm getting the variable QUOTE is unbound when I do it that way. When I switch to (list 'v1 'v2) as argument, it then says the variable list is unbound.
20:43:19
thymage
Sorry I accidentally sent the above "i'm getting... messsage" when I hit up and then enter
20:45:02
mrcom
If you don't use the "&rest" before args, and explicitly pass a list, then mapcar evaluates that list item by item. The first item will be "quote" or "list" depending on exactly what you did.
20:46:56
mrcom
You want to think Lispish--except for (setxxx) functions, functions just return a value. They don't put it anywhere. That's the (setfxxx)-type functions's jobs.
20:51:54
mrcom
Think I steered you a bit wrong. This is a macro which is evaluating its arguments. So lists don't need to be quoted, and don't need to be include "list".
20:55:03
thymage
Oh wait, I don't know that I need the macroexpand anymore. I moved away from trying to do expand-args
21:03:33
mrcom
dlowe: No, we're defining s-expressions with a specific format, for feeding to a macro that evaluates its arguments ala LOOP.
21:06:04
mrcom
EVAL is needed because the end-use macro doesn't actually EVAL, so we can't just "(defmacro x (args) `(mapcar blah args)"
21:08:05
mrcom
And he wants to compose the end-use s-expression using some kind of symboled sub-expressions.
21:10:37
mfiano
Unless I'm completely misunderstanding, you don't have to use EVAL for that. I would strongly recommend against it.
21:12:55
mfiano
You can always store a thunk to be COMPILE'd, and even that is rarely ever needed over just breaking it up into functions, unless you are expanding macros at runtime.
21:15:19
mfiano
Macros are for syntactic abstractions and evaluation control. Which of these do this fall into?
21:16:23
mrcom
The library is using macros to transpile s-expressions to C code. We're way outside polite usage :)
21:16:51
thymage
So, I must defmacro my way to success. The macro gives a lot of errors and we would like to have the list be computed.
21:16:53
mfiano
That sounds like the job for a function with a light syntactical abstraction over the top
21:19:49
mrcom
What mfiano, and others, are objecting to is a good-practices and code-stink issue for Lisp.
21:20:42
mrcom
In Common Lisp you very rarely, if ever, do the equivalent of run-time syntax evaluation. That includes string interpolation.
21:22:03
mrcom
Lisp functions take input arguments, including lists and s-expressions, and return new lists.
21:24:19
mrcom
The really Lisp way to do this would be for a "to-c" function to take a tree of declarations and expression lists and write it to a stream.
21:24:51
mrcom
Instead it does it like LOOP does; creates a new syntax and embeds it in the rest of the code.
21:28:59
mrcom
We want "(defconstant v1 '(a int)) (defconstant v2 '(b float)) (defconstant v3 (declare-struct (v1 v2))"
21:31:14
thymage
I don't want to define variables as the result of declare-struct, I want to pass declare-struct an computed list
21:46:01
thymage
mrcom, The way I did it was to soft link it to the local projects. I couldn't find it in any of the ultralisp or quicklisp repos. Maybe there's another one that I don't know about.
21:53:55
thymage
RUN git clone https://github.com/kiselgra/c-mera.git ~/quicklisp/local-projects/c-mera
0:33:03
mrcom
thymage: Yeah, I'm playing with it now. (Turns out ultralisp was seeing the same load/compile error as quicklisp, it just ignored it.)
0:53:01
dlowe
remember - if you have a function that generates code, it is super easy to convert it to a macro.
0:53:49
dlowe
so often, even if you are writing a macro, it can be useful to start with a function first.
1:13:54
thymage
Ah ok. I got to where I could pass a list to define-struct but I am getting parentheses in my output
1:14:44
mrcom
This thing is just a simple re-formatter. No connections between (struct x ...) and any references to x.
1:17:41
thymage
I moved the macro use into a wrapping function call so that I could move the parentheses and backtick out of the function body
1:18:29
mrcom
That will probably make it easier for your master plan, too, where you loop over types or whatever.
1:19:14
mrcom
What I can't figure out is how to reference struct fields. (return z.x) gets translated to "RETURN Z_X;".
1:19:59
thymage
Yeah, at some points I'm like maybe it just even makes sense to use strings. I have to for some of the type names. I think I need to basically make a naming scheme.
1:20:19
mrcom
I mean, they're doing it somehow. There's test cases for struct forward definitions, and c++ output.
1:22:32
thymage
Ah ok. Hmm, well I'm not too sure. I suppose it's feasible to extend the syntax and make a PR.
1:22:57
thymage
And I was noticing that about the formatting, because it seemed like typos would make it into the output.
1:28:55
mrcom
Yeah, there's very little syntax checking. It was happy with "(decl (((struct x) z)))", which returnsed "struct x; z;".
1:33:45
bougyman
I mean, it supports syntax goodies for hundreds of languages. I assume that's written in lisp.
1:34:14
thymage
Yeah, lisp makes it really easy to extend the syntax right from the get go in the language anyway
1:49:37
mrcom
No, nothing working yet. The good news is that you can define and external macro and expand it inside (struct ...).
1:54:20
thymage
Alright... one other plan. What if, instead of trying to pass all of the arguments in at once, actually that the struct is built by iterating over the list
1:54:59
thymage
So that, at all points, you still have access to continue to add to the grammar before you interpret it.
1:56:58
mrcom
At some point you'll still need to invoke (struct ...) and (function ...) with generated stuff.
2:04:52
thymage
I know. I just mean, can't I syntactically expand something and then evaluate it afterward
2:07:42
mrcom
The two-fold problem is a) finding some way of invoking (struct...), (function...), etc. with stuff it likes. and b)
2:10:15
mrcom
I think the c-mera folks had that same problem themselves. You'll notice that calling (simple-print) and running it through cm produce two very different things.
2:16:02
mrcom
thymage: First you create a .lisp file, such as my file xx.lisp: https://plaster.tymoon.eu/view/3259#3259
2:39:43
mrcom
thymage: Its easier to wrap something around (struct) than to try to shove something into it.
5:32:09
mrcom
thymage: Working example for programatically creating structure types: https://plaster.tymoon.eu/view/3261#3261