libera/#lisp - IRC Chatlog
Search
19:25:55
ori
hi, I'm making my first steps with lisp, and I'm a bit confused by why/when quoting functions is required. For example, here: (apply #'+ '(1 2 3)) -- why do we need to prevent '+' from being evaluated?
19:27:31
dash[m]
in common lisp `#'` doesn't actually quote, it retrieves the function value for the symbol
19:27:33
jackdaniel
if you had written (apply + '(1 2 3)) then apply would try to look up the function bound to +
19:28:35
jackdaniel
yes, 'xxx is a shortened version of (quote xxx) and as dash[m] points out #'xxx is a shortened version of (function xxx)
19:30:18
jackdaniel
there are lisps with shared namespace for both variables and functions, most notably scheme
19:33:43
ori
ok, that makes sense, I think. But here's another example I'm confused about (these are from ch. 2 of Paul Graham's ANSI Common LISP): (funcall #'(lambda (x) (+ x 100))
19:34:15
pjb
(values (let ((+ (function *))) (apply + '(1 2 3))) (let ((+ (function +))) (apply + '(1 2 3)))) #| --> 6 ; 6 |#
19:34:49
pjb
You cannot just bang onto the machine, you need to know what you're doing banging on it.
19:35:01
jackdaniel
and it isn't necessary (it was planned to be necessary, but for compatibility with islisp lambda has been defined as a macro that expands to a function)
19:36:02
pjb
dash[m]: #' creates the closure. #'x expands to (function x) and it is function that creates the closures.
19:38:00
jackdaniel
I don't think that this would mislead anyone, unless we are teaching elementary arithmetics
19:38:26
pjb
ori: #'x = (function x) 'x = (quote x) (flet ((x () 33)) (let ((x 42)) (list x (quote x) (x) (function x)))) #| --> (42 x 33 #<Compiled-function x (Non-Global) #x30200263B98F>) |#
19:39:34
pjb
ori: x can name a function (here a local function defined with flet), a variable (here a local variable defined with let). In an expression, we may want to get the result of a call to the function; this is done with the parentheses (x) ; or we may want the value bound to the variable; this is done with just the variable name: x
19:40:05
pjb
ori: or we may want to get the symbol naming the variable itself, then we need to quote it: (quote x) returns X instead of the value of X.
19:40:18
blueyoner
people dont write useful software in lisp, they just engage in casuistical arguments about trivia
19:40:38
pjb
ori: and for functions, we may want to get the function itself, instead of its name, So we quote it with (function x), because functions and variables are in different namespaces.
19:40:53
jackdaniel
blueyoner: and you extrapolate these insightful conclusions from the irc channel? of course people /chat/ on irc channel
19:41:53
pjb
ori: note that you can define your own namespaces, and use the symbol x to name other things than variables or functions.
19:42:54
pjb
ori: for example, packages are named with strings, and package operator take string designators, so you can use X as a designator to name a package: (defpackage x (:use cl)) (in-package x) ; <--- X names a package here.
19:43:47
pjb
ori: (actually, it's the name of the symbol X, namely the string "X" which names the package)
19:43:51
sham1
Well, the actual and sad reason for the relative unpopular-ness is the s-expressions. It's such a non-issue but it turns people off quite a bit. Especially since not many editors support structured editing
19:44:52
pjb
ori: you could define operators, such as (define-color …) and (color x) and (mix (color x) (color blue0)) and here, x would name a color. (list (quote x) (color x) …))
19:44:57
ori
I can't say I understand everything but the overall vibe I'm getting is that these are particulars of the language that I'll pick up over time (I hope) rather than a Big Concept I'm failing to grok.
19:45:14
pjb
let's be happy we don't have to write (variable x) to get the value of x (sometimes we use (symbol-value x) however).
19:46:27
pjb
sham1: well, it's not that horrible, it's quite nice to make it explicit, eg. in a formal semantics of the language.
19:49:27
sham1
Just as how I don't want to write an explicit continuation argument for every single lambda I write
19:50:52
jackdaniel
sham1: but some code would be clearer if dynamic variables had their own namespace
19:51:09
jackdaniel
not really an issue because people seem to agree, that such special form is surrounding earmbuffs
19:59:08
sham1
Meanwhile in scheme when one defines a parameter (i.e. a dynamic variable) you get a procedure to call, which gives you the current value
20:06:57
blueyoner
sham1: I now find s-expressions way easier to read than something like C or python
20:08:07
blueyoner
subjectively it feels more like reading a natural language with words and syntactic structures, instead of a list of commands to a machine
20:09:53
sham1
There's a reason why a lot of people go for algol-like syntax and scoff at other stuff
20:10:24
Odin-
Moreover, the difference isn't _really_ in the syntax; you could define an algol-like syntax for a lisp and it would still feel alien to non-lispers.
20:11:12
sham1
Unfamiliar semantics require that the person get over the initial knee-jerk reaction that they get from "why the paren"
20:12:02
sham1
And then came the AI winter. It's interesting that with the renewed interest in doing "AI", lisps haven't taken off. Perhaps people just forgot
20:13:09
jackdaniel
lisp was a suitable general purpose language for "old" ai because methods were about manipulating data (and not crunching numbers)
20:13:44
sham1
There's no reason why something like numpy and tensorflow couldn't have been developed for Common Lisp or whatever
20:33:24
jcowan
I use `list` as a variable/argument name all the time, as long as I don't need the global `list` function in the same lexical scope
20:36:42
jcowan
ISLisp does have a separate namespace for dynamic variables, using DEFDYNAMIC, DYNAMIC, LET-DYNAMIC, and (SETF (DYNAMIC.
23:32:51
kagevf
pjb: "you can define your own namespaces" - did you literally mean "namespace" or were you using it as a synonym for "package"?
23:38:07
moon-child
kagevf: ^ above defines a new namespace for 'blubblers' (whatever those may happen to be)
23:40:21
pillton
moon-child: No. The operations FIND-BUBBLER and ENSURE-BUBBLER define a new namespace.
23:45:00
kagevf
so if I define a dynamic variable, and further define find-<variable name> and ensure-<variable name> I have a namespace??
23:58:55
pjb
kagevf: it doesn't have to be a hash-table. It can be any kind of mapping between a name and an object.
0:02:14
pillton
kagevf: ENSURE-BUBBLER installs a binding between a NAME and an OBJECT. FIND-BUBBLER retrieves the object for a given NAME.
0:05:52
kagevf
pillton: "installs a binding" - would that abstract the interaction with the hash table (or whichever key-value store we use)?
0:08:57
pillton
kagevf: That is right. A namespace is simply a set of name->object pairs. How the set is stored and mutated is irrelevant.
0:21:38
kagevf
I never thought (but by now I should've known) that you could create your own namespaces in CL
0:23:53
kagevf
I don't know scheme much at all, but could something like this be used in scheme to support multiple namespaces? or does it have some fundamental flaw preventing this from working? ... just curious ...
0:25:01
pjb
kagevf: then you can define a macro such as (color-let ((green (0.1 1.0 0.2))) (fill-rect (mix blue green)))
0:27:49
pjb
kagevf: but scheme likes to have a single namespace. So you'd have; (let ((f (lambda (c) (fill-rect (mix blue c)))) (green (color 0.1 1.0 0.2))) (f green))
0:55:40
mdhughes
And in my actual graphics library, I use a combination of symbols, which are keys in an application-specific palette hashtable, ints (decomposed as ARGB), and 4-vectors. SDL takes them as 4 args, so it has to be decomposed sometime.
0:56:53
mdhughes
And if I had a more modern color API, I'd need another way to represent HSL for HDR displays.
1:04:53
White_Flame
if your color names were symbols, then a plist entry on the symbol would be faster than a hashtable lookup
1:07:24
mdhughes
This is in Scheme, and in any case, probably not. A palette is just large enough to make hashtables faster than an alist or tree.