freenode/#lisp - IRC Chatlog
Search
15:02:14
Xach
I think I use it too little to solve printing problems and that is something to correct!
15:03:46
Shinmera
Xach: I think I found a quite nifty use case for it in my GLSL toolkit: https://github.com/Shirakumo/glsl-toolkit/blob/master/printer.lisp
15:04:14
Shinmera
Though I use a preprocessing step to turn ~o into ~/ORG.SHIRAKUMO.TRIAL.GLSL::%FORMAT-OBJECT/, since that's quite a mouth full.
16:10:09
bl1nd
I want to learn clojurescript. Should I learn clojure before? Should I even learn another dialect of lisp before Clojure?
16:12:11
Shinmera
This channel is for Common Lisp, so you will be told to learn Common Lisp, regardless of your interest in Clojure.
16:12:18
schweers
bl1nd: note that this channel is about common lisp, not the whole lisp family. Nevertheless I suppose learning clojure first will make your life easier.
16:21:22
schweers
not a problem. I guess there are channels dedicated to clojure and clojurescript. Maybe you should ask there
21:33:13
Shinmera
A text editor in a slide show because why not? https://www.youtube.com/watch?v=Or9zsq3iO7A
21:59:13
Xach
I've been trying to think of a way to add local package nicknames without adding any new packages or functions, only extending existing functions.
21:59:38
Xach
But I can't think of a place to put a way to map a package to a local name in effect for it
22:00:34
Xach
e.g. if you have a local nickname for "com.xach.mycoolpackage" as "mcp", (some-standard-function (find-package "org.xach.mycoolpackage")) => ("mcp")
22:02:01
sukaeto
jeosol_: I believe this is a minimal example nginx config: https://pastebin.com/pXx9U7nK
22:02:36
sukaeto
iirc, the round robin is the default (I couldn't find anything explicitly setting it). The stuff in fastcgi.conf is just the default that comes with nginx
22:07:31
sjl
could add a key parameter to package-nicknames: (package-nicknames "org.xach.mycoolpackage" :local-to (find-package "some-package")) => ("mcp")
22:18:31
jeosol_
sukaeto: you are using clack for this? anything else I need to use this nginx config file.
22:21:46
sukaeto
jeosol_: yeah, it's just clack. If you're not using docker, you'll have to come up with some scheme for assigning ports to the workers (and supervising them)
22:22:29
jeosol_
I haven't done anything, so I can use whatever works to get me to get an AWS instance working
22:22:35
sukaeto
(of course, replace "worker1", etc with the container names, or localhost if you're not using docker)
22:24:11
jeosol_
While I have used hunchentoot, have not used it with nginx. Haven't used Clack at all. So some learning to do on my end.
22:29:59
didi
So reading about dynamic extend, I got an idea: If, when using FFI, instead of messing with the GC, we declared the alloc'ed variables with dynamic extend and cleaned them just before leaving the block?
22:32:54
jeosol_
@sukaeto: you are saying with docker, the assignment of ports to workers is handled if I am using docker?
22:34:00
sukaeto
jeosol_: the docker containers themselves have their own own "port space". They're kind of like mini guests on the host
22:34:22
sukaeto
so yeah, you can have all the workers just listen on the same port and there won't be any collisions if they're each in a different container
22:35:55
jeosol_
I see, I admit I am not a docker expert. I will have to read up on this. Thanks for the explanations
22:36:54
didi
stacksmith: Well, many alien libraries have functions like `make-widget', which malloc memory.
22:37:42
stacksmith
didi: I have a macro "with-foreign-vals" that makes an environment with allocated foreign values. Like (with-foreign-vals (:int16 x :int16 y :int16 width :uint16 height) ...) I use it all the time for ad-hoc cffi allocations.
22:38:43
didi
stacksmith: Cool. I struggle with the idea of wrapping these variables because I want to feel like programming in lisp, even if I'm calling foreign functions.
22:41:47
stacksmith
didi: you could actually do what you described, but I prefer - at least during development - to be able to create a window with widgets, say, and return to REPL...
22:44:34
didi
stacksmith: I know what they are, but never used them. Well, except for non-local exits.
22:46:49
stacksmith
didi: I've never used any built-in ones, but sometimes it feels really great to turn a program inside out... Like say an image viewer that decodes as many bytes as you send it and returns instead of a loop that takes over and blocks...
22:50:06
didi
stacksmith: Well, you don't need continuations for that. You can use threads. Unless you want green threads, AIUC. I've being writing a library for concurrency programming for a while, that abstracts away from threads, but I've being stuck.
22:52:03
stacksmith
didi: I am always dealing with deeply nested trees, and I wind up wanting to do something deep inside on a branch. I could send a lambda, but it can only do so much. With continuations, I could make the code stop where I want and return. Then I can do things like bind some variables and go back in for the rest of the branch.
22:53:58
didi
Bike: I dunno. Good question. Maybe it can be used. But the more high level question is: Should the alien variables feel like lisp variables that can be GCed or not?
22:57:00
stacksmith
I thing by GC didi means just getting rid of it properly at some point in the fugure.
22:58:33
stacksmith
There was an idea of keeping foreign variables on the stack and having them go out of scope naturally, I believe.
22:59:31
didi
Maybe not in the stack. The "dynamic extent" has more to do with the idea of an object being valid just inside the block.
23:06:07
smokeink
jeosol: I'd recommend lighttpd over nginx (I had some issues in the past with its config files , its config script language it's one of the dumbest I've ever seen) . Some notes here: http://dpworks.net/miscellanea/mod_lisp-lighttpd.html , http://pastecode.ru/8d5d29/
23:09:17
stacksmith
Bike: I think the reason I wrote with-foreign-vals is because I allocate/free a single foreign object containing all the foreign values specified...
0:05:24
johnnymacs
It basically lets you have multiple namespaces so you can re-use symbol names for shorter code
0:07:13
jasom
johnnymacs: variable and function names are actually not strings in lisp, but rather symbols. You can create a unique symbol with a given name in any package, you can import symbols from one package to another, and you can even create symbols that are not in any package at all.
0:07:44
jasom
The last one is useful for writing macros; you can create brand new symbols with readable names that are guaranteed to not be used anywhere else in the code.
0:08:24
fouric
Does anyone know of a Common Lisp project in a GitLab repository with successfully running CI that I might be able to take a look at?
0:09:06
jasom
johnnymacs: all of the symbols defined in the common lisp standard are in the "COMMON-LISP" package, which has an alias of "CL" so e.g. "cl:print" will always refer to the standard print, while "print" will refer to whatever symbol is named print in the current package.
0:26:13
johnnymacs
https://github.com/search?utf8=%E2%9C%93&q=integration+language%3A%22Common+Lisp%22&type=Repositories&ref=advsearch&l=Common+Lisp&l=
0:28:22
fouric
I don't know if it's incompatible with GitHub's, but that's partially because it's really hard to search for repos with CI set up
0:28:35
fouric
if someone more knowledgeable than I tells me that they're interchangable, then I'll believe them
0:34:42
johnnymacs
there could be continuous integration that is setup for git that is agnostic to gitlab or github
0:44:41
johnnymacs
I think what you are trying to say is that lisp handles the reference passing automatically
0:45:38
Bike
it's not like C where you can have things and then you can have pointers to things, and so on.
0:48:33
onion
i think he is just looking for how to 'reference' an entry of a hash table ? why complicate?
0:49:30
Bike
Okay, if you want implementation details, here's the thing. Common garbage collection strategies rule out the use of pointers by the programmer.
0:49:53
Bike
"copying" GCs move objects around in memory, which means pointers would stop working fast.
0:50:47
onion
ie not passing a "whole object structure" to functions as what we can do with C without pointers
0:51:14
fouric
johnnymacs: Yeah, but there's already an FFI (actually, several - to C, C++, Python, and maybe a few more), and none of them needed malloc() written - modern implementations provide ways to do that.
0:53:46
johnnymacs
Other people are getting confused about my support question when my question is already answered
0:55:55
onion
i would definately ask "whats a ref to a hshtbl" but we like to talk about lisp also, so =)
0:59:04
didi
"In Common Lisp, a data type is a (possibly infinite) set of Lisp objects. Many Lisp objects belong to more than one such set, and so it doesn't always make sense to ask what is the type of an object; instead, one usually asks only whether an object belongs to a given type. The predicate typep may be used to ask whether an object belongs to a given type, and the function type-of returns a type to which a given object belongs. "
1:11:08
onion
how are there types that are not classes, if 'everything is an instance of a class' ??
1:11:28
sjl
The thing that helped me most with types was when I started thinking about them as sets of values.
1:12:27
sjl
E.g. the type designated by `(integer 1 10)` is the set of integers from 1 to 10. The type designated by `(or integer list)` is the set of all integers unioned with the set of all lists.
1:13:50
sjl
When you make a class, Lisp also helpfully defines a type for you with the name of the class, which means "the set of objects that are instances of this class (or a subclass of it)"
1:14:13
sjl
But it does muddy the waters if you're not used to thinking of types as sets of objects.
1:16:43
Bike
also conveniently explains why you can't specialize methods on types, because types don't have enough structure for ordering.
1:17:34
sjl
Thinking of them as sets also makes subtypes and supertypes easier to understand. E.g. bit is a subtype of integer because the set {0 1} is a subset of the set of all integers.
1:21:49
onion
sjl: yeah, i ve been mentioning deftype a few times this week. i didnt know CL had that !
1:21:56
sjl
This also demystifies the Haskell/Scala "when is a particular function type a subtype of another" that takes blog posts like https://www.stephanboyer.com/post/132/what-are-covariance-and-contravariance to explain
1:24:02
Bike
the way function types are defined, they're not like other types in referring to a set of objects
1:24:53
sjl
(function (vector) integer) is a subtype of (function (string) number) because it accepts a superset of the arguments, and returns a subset of the results
1:25:22
sjl
Is (function (vector) integer) not "the set of all functions that accept a single argument, which is a vector, and return an integer result"?
1:26:05
Bike
like if foo is declared to be a (function (vector) integer), that's like rewriting (foo bar) as (the integer (foo (the vector bar)))
1:27:26
sjl
> list form of the function type-specifier can be used only for declaration and not for discrimination. Every element of this type is a function that accepts arguments of the types specified by the argj-types and returns values that are members of the types specified by value-type.
1:27:28
Bike
which means, say, that (except package restrictions) you could locally declare CAR to be of type (function (cons) t), even though (function (cons) t) is not a subtype of (function (list) t)
1:29:13
sjl
CAR *is* a member of "the set of all functions that accept cons arguments and return t elements"
1:30:56
sjl
I think it hinges on whether you consider "accepts an argument of type X" to mean "accepts an argument of EXACTLY type X"
1:31:17
Zhivago
Ah, not because of ordering, but because specializing on type gives you fundamentally incoherent semantics.
1:31:23
Bike
well, since you obviously can't actually use function types as a membership thing, it doesn't matter so much to me.
1:31:47
Bike
one time i thought too hard about this and decided that lisp types mean at least three different things that are mildly incompatible, which is why it's confusing.
1:32:02
Zhivago
It means that your operation is really multiple operations with different semantics which are conflated.
1:32:06
sjl
sure, yeah, whether the computer can actually *figure this stuff out* is a different story, and unfortunately the answer is usually no
1:32:34
Bike
i don't mean the compiler. i mean you can't do (typep foo '(function ...)). i'm not even sure what that would mean.
1:32:45
Zhivago
In contrast, if your function takes a single type, and dispatches based on implementation (i.e., class) then it should have coherent semantics.
1:34:07
pillton
The generic function name may return a symbol for a set of objects, or it could return a string for others.
1:34:12
sjl
(typep foo '(function (x) y)) would mean "is foo a function that accepts a single argument of type x, and returns a result of type y"
1:34:35
sjl
Which probably no current lisp can reliably answer. But I don't think it's an unclear *question*.
1:35:07
Zhivago
You can certainly dispatch on type -- the problem is that if you're dispatching on type, you're doing bad things to semantics, so you probably shouldn't.
1:36:08
sjl
> Every element of this type is a function that accepts arguments of the types specified by the argj-types and returns values that are members of the types specified by value-type.
1:41:41
sjl
You could just ignore any case that fails, and say "those don't contribute to the type". I suppose that's fairly reasonable.
1:42:30
sjl
Right, "does not return" isn't really captured in the current CL function type. Maybe we need an extra parameter
1:44:12
sjl
It's probably reasonable to say "any code path that doesn't return anything has no effect on the type of the function"
1:46:14
sjl
so you could check that the person actually passed a function that takes one parameter and returns something
1:47:43
Bike
guess you could consider (function (&optional t)) a subtype of (function (t)), cos it accepts more argument (lists)
1:47:46
sjl
sure. (function (t &rest) t) is a subtype of (function (t) t) because it accepts one parameter (and also possibly mroe)
1:48:51
sjl
Or, e.g. I have a function in my project Euler repo called SUMMATION that takes a sequence and sums it, and it takes a :key argument. That :key function should be a subtype of (function (t) number).
1:48:58
Bike
well this limited accepts is easier, it's whether the argument list is accepted by the lambda list, in the sense of acceptability defined by the lambda list rules etc
1:50:05
sjl
Because #'car is a perfectly valid key when you know all the elements start with a number, but its return type isn't a subtype of number.
1:50:44
smokeink
(= (+ 37 (sb-vm::get-lisp-obj-address #'car)) (sb-vm::function-raw-address 'CAR)) ;==> T . In sbcl what's the difference between get-lisp-obj-address and function-raw-address ?
1:51:05
Bike
obviously the type of car should be understood as null -> null | forall A (cons A T) -> A instead
1:52:25
Bike
smokeink: this seems like an #sbcl question. but it looks like function-raw-address is used for static linking, so it might be the actual entry point and not the closure words or whatever the hell
1:59:37
parjanya
the fright lisp sometimes gives me reminds me of when I was learning Latin, but it’s a little worse ; )