libera/#lisp - IRC Chatlog
Search
5:25:44
a-m-g
Hi all. In Common Lisp, how would I bind variables (ie using let) only if a variable is true?
5:33:01
samebchase
a-m-g: I'm assuming you want something like Clojure's `if-let`? There's no built-in in CL which allows you to do that, however, there are some Clojure-inspired libraries which have an `if-let`. In any case, it should not be too difficult to whip up your own.
5:33:46
moon-child
a-m-g: if so, you could say (progv (if cond '(*var*) '()) (if cond (list value) '()) body)
5:41:16
a-m-g
Hey all. What I'm trying to do is check a switch, and if the switch is true, then bind these variables.
5:49:59
moon-child
if you are looking for something lexical, then, modulo mutation, something like (let ((x (if cond new-value x))) ...) would do the trick
5:51:10
moon-child
with mutation ... I don't think it would be possible to do better than duplicating the entire body (though of course that is a cinch with #n= et #n#)
8:13:12
holycow
what is the (, bit of the form? I have never seen that before an never seen that used anywhre. google returns nothing similar to that
8:20:31
holycow
i mean, that sounds right, i have never seen a flop inside a bracket and before any function / list item
8:25:43
wasamasa
> <program> and each <arg> are implicitly quasiquoted. <program> can be a string, symbol, number, or an unquote expression ,e that evaluates to a value of one of those types. Each <arg> follows the same rules as <program>, but can additionally be an unquote-splicing expression ,@e that evaluates to a list of multiple arguments where each element is a string, symbol, or number.
8:26:32
wasamasa
the idea is that normally, a macro invocation treats all of its arguments as if they're quoted, but an unquote would allow exceptions to this
8:26:34
holycow
oh. looks like i have a bunch of new learning to do. thank you kindly wasamasa. i really appreciate that!
8:28:12
wasamasa
note that this trick doesn't work universally in all the lisps, elisp for example doesn't support it
8:28:55
holycow
i have been avoiding macros, but i guess it is time to dig in. i did not expect the great links tho
12:15:21
capjamesg
Would anyone be up for quickly reviewing a simple program? It feels a bit verbose but I'm just glad I got it working :D
12:20:27
jackdaniel
http://turtleware.eu/static/paste/f8c730bd-cantdo.lisp improves slightly the style to be more "contemporary"
12:57:13
pjb
capjamesg: apart if for pedagogical reasons, why don't you just use a function instead of a macro? (explain-permissions "rwxr-xr-x") and (encode-permissions "rwxr-xr-x") -> #o755
14:05:05
jcowan
wasamasa: the quasiquoted-body trick is definitely portable Scheme, because Scheme insists on expanding `... to (quasiquote ...), and ,... to (unquote ...), etc.
14:06:06
jcowan
however, CL implementations are allowed to expand `(A ,B) directly to (LIST 'A B) or the equivalent, in which case there is no unquote to get a grip on.
14:06:42
jcowan
I was trying to figure out what sbcl does by feeding it '`(a ,b), but it replies `(a ,b)!
14:08:48
jcowan
Ah, turning off *print-pretty* does it, and I get (SB-INT:QUASIQUOTE (A #S(SB-IMPL::COMMA :EXPR B :KIND 0)))
14:14:57
aeth
',b probably could work in SBCL (but not necessarily every CL) but it would break portability so it doesn't
14:15:06
jcowan
The standard requires "read" to exist, and prescribes its behavior, but gives no standard way of modifying it. Some Schemes like Chicken support readtables, but others use non-table-driven approaches like recursive descent
14:20:40
jcowan
In the Chicken REPL the control commands are of the form ,foo; the reader expands this to (unquote foo), which the REPL looks for separately before calling eval.
14:21:40
jackdaniel
i.e clim listener does exactly that > ,foo looks up the command, while > foo looks up a variable
14:24:23
jackdaniel
to add some more reference points: ecl treats specially forms like :help when typed in its repl