freenode/#lisp - IRC Chatlog
Search
3:27:53
slightlycyborg
I wrote a todo list in lisp. I orignally saved all my completed todos into an sql db...I recently added a twitter backend though, so now all that info gets livetweeted. Most pointless twitter account ever
3:28:48
slightlycyborg
My next pointless twitter account driven by lisp will be a live video stream of myself broken up into 140 second video segments.
3:51:06
beach
If I were you, I would write an ASDF system definition so that you don't have to LOAD explicitly.
3:52:01
no-defun-allowed
yes, an asdf system would make it loadable via quicklisp and simplify dependencies considerably
3:52:13
slightlycyborg
Oh. I've never used ASDF explicitly before. OK. I will put some reading material on how to do that on my todo list
3:52:49
beach
Your indentation is off. It could be that you have TABs in your code so that the pastebin does not display it correctly. Or it could be that your indentation is off. :)
3:53:06
no-defun-allowed
[here's a simple single-layer ASDF system](https://gitlab.com/netfarm.gq/cl-decentralise/blob/master/decentralise.asd)
3:53:30
no-defun-allowed
[this one has directories/"modules"](https://gitlab.com/Theemacsshibe/cl-vep/blob/master/vep.asd)
3:56:07
beach
For an IF, either put each of the three arguments on a separate line, or put everything on one line.
3:56:29
beach
Not the condition and the `then' branch on one line and the `else' branch on a separate line.
3:57:21
beach
For good indentation of LOOP clauses, I recommend you use the slime-indentation contribution.
3:58:40
beach
You either put everything on one line, or else you put the test on the same line as the IF, and you align the `then' and the `else' with the test.
4:00:13
beach
You have some code duplication in there. todo-select and todo-complete are almost identical.
4:00:48
beach
You could make a single function that takes an additional argument. Either 'complete or 'select.
4:02:00
beach
It is a bit strange to have (IF (NOT ...) rather than removing the NOT and reversing the arguments. Especially since INTEGERP seems to be the "special case", and you want to handle special cases first.
4:04:12
slightlycyborg
Ok. Do you mean the file name for top level comments. I just put those in there for pastebin
4:06:49
beach
(IF (not (null...)) <only-a-then-branch>) is better expressed as (when (null...) <only-a-then-branch>)
4:07:44
beach
This should keep you busy for a while. I'll review your next version if you like. Now I am off for a break. Back in 30 minutes or so.
4:32:17
beach
(IF (NOT (NULL ...)) ...) is the same as (WHEN (NOT (NULL ...)) ...) which is the same as (UNLESS (NULL...) ...) as you pointed out.
4:54:28
montxero
hi guys, given the following sinppet: https://pastebin.com/tT5vjapJ, is it possible to call func3 in func1 and vice versa?
8:46:08
myrmidon
Hi! I'm trying to make a macro produce a backtick list with some ,@(when ...) forms in it, but all I can get is ,(when ...) forms: https://ptpb.pw/PVsQ/lisp -- any advice?
8:54:39
no-defun-allowed
double backquotes aren't my strong point but i think you'd need to backquote-splice twice
8:59:01
jackdaniel
you may splice it shallow or deep and even CL implementations are not consistent here
9:00:49
jackdaniel
if you are interested in details, check out this thread: http://web.archive.org/web/20130622010232/http://sourceforge.net/p/ecls/bugs/251/
9:04:59
aeth
At this point I'd just use helper functions or at least move most of it to a let at the top to try to make it a little readable
9:06:24
aeth
When the macro gets complicated I tend to do (let ((some-piece `(foo ,(bar 42) baz)) (another-piece ...)) ...)
9:06:40
aeth
At the very least, even if it doesn't help too much with readability, you avoid most ,,s that way
9:08:26
aeth
Whether it makes more sense in a helper function or a let at the top (or both, where the let at the top is just calling a function) is hard to say, of course.
9:10:09
myrmidon
,@(append ,@(...)) is working but I think you're right it's a bit messy, i'll try to rework it
9:39:09
makomo
jackdaniel: i've read the thread you linked but i don't get how ``(,@,@foo) corresponds to the `,@foo case which is undefined
9:46:38
makomo
jackdaniel: right, but that's kinda "handwavy", as it's not how it is formally defined, no?
9:46:53
jackdaniel
I don't have time to discuss it right now, sorry. I have said everything I had to say.
9:47:38
makomo
jackdaniel: ah, ok. i'm just interested in interpreting the formal rules that the spec gives fpr backquote and figuring out exactly where it fails
9:47:55
makomo
jackdaniel: if you come up with an idea, let me know (and i'll do the same if i figure it out)
9:48:17
jackdaniel
I think that all there is about ,@,@ is covered in this thread, so I find hard to add anything to it
9:49:39
makomo
jackdaniel: ahhh never mind, i see it now. you have to do the expansion by hand using the formal rules to see it
10:07:42
makomo
jackdaniel: hm, i said that too quickly, without actually doing it by hand but just thinking that it would surely show up
10:08:31
makomo
jackdaniel: however, regarding your ",@foo is defined, if foo is a list", take this example "(let ((var 10)) `(,@var))"
10:09:58
makomo
afaict, that is a valid backquote template according to the formal rules, because, even though the final forms are implementation-defined, the semantics still have to match with the forms that are used in the formal rules
10:11:00
makomo
using the formal rules, the above expands into "(let ((var 10)) (append var))" which is valid, because APPEND takes any object as its last argument
10:12:03
makomo
jackdaniel: using these rules: http://www.lispworks.com/documentation/lw70/CLHS/Body/02_df.htm
10:12:30
makomo
the bullet "* `(x1 x2 x3 ... xn . atom) may be interpreted to mean (append [ x1] [ x2] [ x3] ... [ xn] (quote atom)) (...)"
10:14:17
makomo
the spec says "`#(x1 x2 x3 ... xn) may be interpreted to mean (apply #'vector `(x1 x2 x3 ... xn))"
10:14:23
jackdaniel
I don't see direct implication on `(,@var) -> (append var), in fact evaluating `(,@3) gives me three, not (append 3)
10:14:50
makomo
jackdaniel: evaluating, yes, but i was talking about the "expansion", i.e. what the backquote template is read in (using the forms given in the standard)
10:15:26
jackdaniel
OK, as I said I have no time to dive into spec. it is not that I disagree or anything, I've just pointed out that ,@,@ is undefined since I saw it
10:15:55
jackdaniel
(I know that I'm not physically forced to discuss that, but all these highlights certainly make me feel so)
10:16:54
makomo
jackdaniel: sorry if i was being a bother, i won't ping you anymore :-). but yeah, if you get the time in the future, let me know
10:17:34
jackdaniel
I want to point out, that I'm not also especially interested in discussing such things unless it is a mean towards implementing something correctly
10:17:57
jackdaniel
I can spend such time on other thigns (also beneficial to CL community), like fixing bugs
10:19:10
makomo
jackdaniel: sure, i understand. s/if you get the time/if you feel like discussing it/ is what i meant :-)
11:35:15
pjb
makomo: on 2.4.6, 4th star (*), [,@form] is interpreted as form. `(foo `(x1 ,@,@form x3)) --> `(foo (x1 ,@form x3)) ; seems legit to me. (let ((form '((1) (2) (3)))) `(foo `(x1 ,@,@form x3))) #| --> (foo (list* 'x1 (append (1) (2) (3) '(x3)))) |#
11:36:37
makomo
pjb: can you perform the expansion bit by bit and show the intermediate results? the thread that jackdaniel linked says that the behavior of ,@,@ is undefined
11:37:06
pjb
makomo: I don't think it's undefined. clhs 2.4.6 has a rule for it, which means that: `(foo `(x1 ,@,@form x3)) --> `(foo (x1 ,@form x3))
11:37:21
pjb
therefore ccl evaluating successfully this form: (let ((form '((1) (2) (3)))) `(foo `(x1 ,@,@form x3))) #| --> (foo (list* 'x1 (append (1) (2) (3) '(x3)))) |#
11:37:42
pjb
seems to confirm that there's a meaning for it, and given it's specified, it seems to be conforming.
11:37:51
makomo
pjb: you can't just collapse it like it. i think you're reading it out of context -- read all of the rules for `(...)
11:38:15
makomo
this one "* `(x1 x2 x3 ... xn . atom) may be interpreted to mean(append [ x1] [ x2] [ x3] ... [ xn] (quote atom))"
11:39:32
makomo
therefore, ``(hello ,@,@there) == `(append (list `hello) ,@there) == `(append (list 'hello) ,@there) == `(append (list `append) (list `(list 'hello) there), no?
11:39:59
makomo
but that's not the result i expected. i expected a `,@foo to show up, which is undefined by bullet 3
11:40:04
pjb
(quote `(foo `(x1 ,@,@form x3))) #| --> (list* 'foo (list (list* 'list* (list* ''x1 (list (list* 'append (append form '('(x3))))))))) |#
11:42:50
makomo
but hm, yeah, i guess it might be wrong, because i can't see what's undefined about it (**using the formal rules!**)
11:45:46
makomo
i do it in small steps, fully expanding all the inner ` before going onto the outer `
11:46:42
makomo
that's how the algorithm works anyway, except it does it recursively. because we're humans, i prefer to do it iteratively. the result is the same, as the innermost backquote is always fully expanded before the outermost one
12:05:48
pjb
(let ((there '((list :x 1) (list :y 2)))) ``(hello ,@,@there)) #| --> (list* 'hello (list :x 1) (list :y 2)) |#
12:06:44
pjb
(list* a d) = (cons a d) (list* a1 a2 a3 .. an d) = (cons a1 (cons a2 (cons a3 … (cons an d))))
12:08:49
pjb
(APPEND (LIST 'HELLO) (LIST :X 1) (LIST :Y 2)) #| --> (hello :x 1 :y 2) |# same result.
12:09:22
pjb
(eval (let ((there '((list :x 1) (list :y 2)))) ``(hello ,@,@there))) #| --> (hello (:x 1) :y 2) |#
12:09:54
pjb
(eval (let ((there '((list :x 1) (list :y 2)))) ``(hello ,@,@there foo))) #| --> (hello :x 1 :y 2 foo) |#
12:10:01
pjb
(let ((there '((list :x 1) (list :y 2)))) ``(hello ,@,@there foo)) #| --> (list* 'hello (append (list :x 1) (list :y 2) '(foo))) |#
12:10:28
pjb
(let ((there '((list :x 1) (list :y 2)))) ``(hello ,@,@there)) #| --> (list* 'hello (list :x 1) (list :y 2)) |#
12:11:15
pjb
(let ((there '((list :x 1) (list :y 2) nil))) ``(hello ,@,@there)) #| --> (list* 'hello (list :x 1) (list :y 2) nil)|#
12:12:24
pjb
Yes, because (append [ x1] [ x2] [ x3] ... [ xn] (quote atom)) means that xn is not the last argument to append. If you have a proper list, then atom is nil.
12:12:54
pjb
So (let ((there '((list :x 1) (list :y 2)))) ``(hello ,@,@there)) should be the same as (let ((there '((list :x 1) (list :y 2) nil))) ``(hello ,@,@there))
12:13:07
pjb
(values (eval (let ((there '((list :x 1) (list :y 2)))) ``(hello ,@,@there))) (eval (let ((there '((list :x 1) (list :y 2) nil))) ``(hello ,@,@there)))) #| --> (hello (:x 1) :y 2) ; (hello (:x 1) (:y 2)) |#
12:13:55
makomo
i've been forgetting about that (quote atom) (or rather (quote nil)) at the end this whole time
12:23:32
pjb
Either formally, or fundamentaly like in this case. Formally in the case of prog2, implementations don't do what's written but what was meant.
12:26:22
flip214
the first has a CDR of NIL, the second has a _list_element_ of NIL (with a CDR of NIL, too)
12:26:44
makomo
flip214: i'm only following the rules given by http://www.lispworks.com/documentation/HyperSpec/Body/02_df.htm
12:26:56
flip214
and my experiments some time ago showed me that ,@,@ is most often wrong - ,',@ is sane ;)
12:27:47
flip214
pjb: makomo: well, AFAIK the CLHS isn't the final standard - and even if it were, it might contain errors.
12:28:17
makomo
flip214: well, that's just speculation i guess. these formal rules have been described by Steele as well
12:28:51
makomo
i agree the standard isn't pefect, but this section in particular being wrong seems highly unlikely to me
12:30:32
flip214
and the first form replaces the last CDR by NIL (which it already was), and so returns the same thing. got ya.
12:39:52
makomo
pjb: ah nice, i was just about to ask whether you were going to open another issue for the `(,@var) thing
12:41:53
makomo
if ccl goes with the changes then i might do it, because i'll have more evidence to point to
12:47:19
makomo
"first it has all the bugs straightened out, including dark corner cases (some implementations still get the simple ``(foo ,@,@bar) wrong);"
13:11:18
russellw
I don't suppose there is anything like a way to tell loop to do one more iteration? Specifically, I'm trying to implement a read-line function as something along the lines of (loop until(eql(peek-char #\newline)) collect(read-char)) but then that doesn't collect the actual newline
13:17:04
makomo
`(,@foo) is technically incorrect but fare-quasiquote accepts it by default in the name of interoperability and consensus. there's a feature you can use to make it signal an error
13:18:08
makomo
jackdaniel: just to let you know: we concluded that ,@,@var is well-defined defined but that `(,@var) is not (contrary to what i said the first time -- i forgot the ". nil")