freenode/#lisp - IRC Chatlog
Search
20:59:10
dxtr
Hmm, when I try to inspect an object in slime with C-c I I get: illegal sharp macro character: #\<
21:00:35
Xach
dxtr: When I want to inspect such an object, I make sure it's the most recent repl result and then inspect "*"
21:01:15
dxtr
I actually had a brain fart because it didn't dawn on me that I'm inserting expressions
21:02:42
Xach
ealfonso: not by itself. you would need something to parallelize it. i like lparallel but raw threads would work too.
21:04:30
dxtr
Xach: Speaking of parallelization; my company (Well.. I. I'm the only one coding lisp here) used your s3 library for quite a while and it was pretty heavily parallelized!
21:05:23
Xach
dxtr: so glad to hear it! i wish i had time to add to it but things have been pretty busy
21:07:59
dxtr
It's quite funny because it was actually intended to be a one-off thing - which is why I made it in lisp in the first place (Because no one else would be able to maintain it otherwise) - but it ended up being run quite heavily and it worked really well
21:09:11
dxtr
It has served its purpose now, though, so we're not using it anymore. It involved synchronizing around 150k images downloaded via HTTP, normalizing file names and stuff and uploading it to our s3 bucket. Saved us quite a bit of labor.
21:18:55
ealfonso
is there something like (nthcdr n ...) that I can combine with loop's "by" without creating a function?
21:20:21
phoe
you could theoretically (alexandria:compose #'cddddr #'cddddr #'cddddr) but that might not be the way
21:36:46
pjb
(loop for start on big-list by (lambda (x) (nthcdr n x)) while start collect (subseq start 0 (min (length start) n)))
21:39:09
pjb
you could add a variable: (loop for l = (length big-list) :then (- l n) for start on big-list by (lambda (x) (nthcdr n x)) while start collect (subseq start 0 (min l n))) ; but it would still read the big-list twice.
21:42:05
pjb
personnally, I just write: (com.informatimago.common-lisp.cesarum.sequence:group-by big-sequence n)
21:43:51
pjb
But if I tell you that you will come again, "and where does group-by come from?" etc…
21:53:05
pjb
dxtr: it uses a global namespace. In the Internet age, were you get systems from anywhere, you can easily have package name collisions.
21:54:05
pjb
Local package name systems have been defined and implemented, but there are variants, and it's not integrated in all implementations yet.
21:54:44
aeth
There are several issues with the package system. (1) No portable local package nicknames and it's very easy for nicknames to conflict. (2) You will wind up with a million exports for any decently sized program, and the verbosity of it seems very unlispy. (3) There's no easy way to check for unused imports or nonexistent exports because of the dynamic nature of it.
21:55:10
aeth
(2b) That verbose million exports thing could easily also apply to imports, which is why most imports are just used with :USE instead of :IMPORT-FROM
21:56:06
aeth
pjb: I do one package per file to keep the exports down and I *still* sometimes wind up with dozens of exports for a moderately sized (400-800ish) file
21:57:05
aeth
https://gitlab.com/zombie-raptor/zombie-raptor/blob/161143c74c456393a28ccb8618d86dd42444eaf7/math/matrix.lisp#L16-61
21:57:44
dxtr
I buy the package nickname/alias argument and the unused checking. The rest is like.. If you need that many imports and exports you need that many imports and exports
21:59:28
aeth
Actually, you don't. Most of the time when you get tons of exports it's because of struct or CLOS object accessors. If you're okay with forcing the user to use with-foo-accessors (a specific version of with-accessors) you can do something like this: https://gitlab.com/zombie-raptor/zombie-raptor/blob/161143c74c456393a28ccb8618d86dd42444eaf7/util/util.lisp#L263-292
22:00:06
aeth
The only imperfection there is that it doesn't check that it's a valid accessor first. I went for simplicity of definition/implementation, at least for now
22:00:41
copec
shka_ I assume you know more than I and I would like to compare/contrast package systems
22:01:13
aeth
(with-foobar-accessors ((foo foo) (bar bar) (baz baz)) foobar ...) ; 1 export instead of 3. adds up if you have tons of structs and CLOS objects all over the place
22:01:36
aeth
Except it's really 2 exports because I also have (with-foobar-accessors* (foo (bar* bar) baz) foobar ...)
22:02:14
shka_
aeth: https://github.com/sirherrbatka/cl-data-structures/blob/e5b8bf35f906790be83b3ca99f3de1a60ce5fa3f/src/utils/macros.lisp#L299
22:02:36
aeth
Oh and my macro system supports prefixes, too. If you want safety, use one prefix for public accessors. The prefix is implicity added.
22:04:02
aeth
In case I was unclear, the accessors could be foobar-foo, foobar-bar, and foobar-baz, and the syntax would be identical in my examples above.
22:04:27
aeth
So it's not just for simpler imports/exports. I also use it internally within the same package to eliminate prefixes.
22:05:07
aeth
So I'm not sure I need to support some kind of safety to prevent people from using accessors they're not supposed to when the prefix system could work perfectly fine for that.
22:18:41
ealfonso
for the chunking issue, I used my own macro, even though sub-chunk elements are reversed https://pastebin.com/gpduRSqD
22:19:35
ealfonso
(loop-do-chunked chunk '(1 2 3 4 5 6 7) 3 (format t "chunk is ~A~%" chunk)) => chunk is (3 2 1) chunk is (6 5 4) chunk is (7)
22:20:43
dxtr
Possibly. I just want to remove a function because I accidentally made it a defun when I wanted it as a defmethod
23:10:35
dxtr
And when I try to prepare a statement it says my table doesn't exist - although I can select from it from the cli
23:26:50
pjb
Notice how you can thus define as many packages as you want, as different interfaces for different clients.
23:49:38
dxtr
Well, what I'm making a sort-of wrapper around some cl-dbi functions and I've defined my execute like (defun execute (conn query &rest parameters)) - but that fails with prepared statements that is supposed to have zero parameters
23:50:26
dxtr
But I can't just do (if parameters (dbi:execute ... parameters) (dbi:execute ...)) because I don't know if parameters actually is nil
3:13:38
ealfonso
I heard that hunchentoot sessions are not really secure... "Hunchentoot makes some reasonable effort to prevent eavesdroppers from hijacking sessions (see below), but this should not be considered really secure. Don't store sensitive data in sessions and rely solely on the session mechanism as a safeguard against malicious users who want to get at this data!" is there an easy way to make them secure?
4:29:54
pillton
Probably not, mainly because communities write language run-times that don't compose.
4:44:12
vtomole
Is there a "duplicatesp" that checks if a list contains duplicates. I only see remove-duplicates and delete-duplicates from clhs so far.
4:47:06
vtomole
Aha! I finally found a procedure that "Makes sense" to be in cl-user but it's not ;)
4:58:27
vtomole
I forgot that Alexandria is kind of like the "procedures that would be nice to have in cl-user" library.
5:52:12
ealfonso
when I start a repl in slime, how I switch to a package and load some sexps in that package? I've tried (swank:set-package "...") (swank-repl::in-package "..."), but it doesn't seem to work the first time
5:57:48
ealfonso
mathZ I get "var is unbound" for a defvar'd var in package A after (in-package "A")
5:59:10
ealfonso
also, how is it possible that I'm getting a "function is undefined" for a function I declared as an (:import-from package function) ?
6:06:23
beach
ealfonso: I always put (cl:in-package ...) on top of files, because you never know what the current package is when you load or compile them.
6:08:11
ealfonso
this is the sexp I'm using to load my project on a new repl. the "start" and "make-config" functions are defined in one of my packages: (progn (load "my-project.asd") (ql:quickload "my-project") (in-package "my-project") (start (make-config :port 4242)))
6:08:48
theemacsshibe[m]
it's the thing that lets normies like me use IRC with slightly more features
6:09:18
beach
ealfonso: You should probably not LOAD the ASDF file, but instead make sure ASDF finds it on your system.
6:09:40
ealfonso
the second time it works... I'm wondering if there's a way for it to work the first time
6:11:26
ealfonso
beach I feel that even if I did that, the first time the my-package:my-symbol symbols would still be interpreted as being in COMMON-LISP-USER at first in the slime repl
6:12:05
beach
ealfonso: so any symbol without a package prefix is going to be interned in the cl-user package, including make-config.
6:12:49
ealfonso
beach yeah. but if I prefix those symbols with my project, I think I get a read error since the package hasn't been loaded
6:12:53
beach
ealfonso: Plus, you can't really give it a package prefix, because that package does not exist when the form is read either.
6:14:39
ealfonso
so I guess have to live with manually running the form twice. or running two different forms
6:17:51
beach
Instead of (make-config ...) you can do (funcall (find-symbol "MAKE-CONFIG" "MY-PROJECT") ...)
6:27:22
ealfonso
beach it was annoying to have to wait at the repl for one sexp to finish loading only to enter another one
6:35:05
beach
kuribas: If you are new to Common Lisp, you probably want to start with the Common Lisp HyperSpec.
6:36:03
beach
Otherwise, if you are looking for the SBCL manual, it is here: http://www.sbcl.org/manual/
6:38:17
beach
You can download the Common Lisp HyperSpec from the site I showed you, but not in info format.
6:38:45
beach
But there is an Emacs library that accesses the Common Lisp HyperSpec and shows it in an Emacs buffer.
6:41:38
beach
I forget, sorry. I don't need the Common Lisp HyperSpec so much these days, so I haven't bothered installing it.
6:42:51
beach
Yeah, maybe so. But it might require a local copy of the Common Lisp HyperSpec. Again, I forget. You would have to read the documentation.
6:50:25
phoe
elisp uses dynamic bindings by default, as stated at https://www.gnu.org/software/emacs/manual/html_node/elisp/Variable-Scoping.html
6:58:42
kuribas
lol "I basically do not have a very high opinion of many of the decisions that were made in Common Lisp."
7:00:48
kuribas
he is very stubborn in his view, but has been a big force in the free software movement.
7:01:34
beach
kuribas: Also, at the time, he complained that Common Lisp was (still is) "huge", but since then, other languages have become even bigger.
7:01:43
phoe
kuribas: many of the choices made in CL were not made because they were good at that moment, but because they were the best at that moment
7:05:35
xificurC
beach: really not much? No new multi-threaded GC algorithms? Stack allocation strategies? Optimization techniques?
7:06:38
beach
xificurC: That's strictly speaking not programming-language design, but implementation techniques. There is a lot of work in those domains.
7:09:40
beach
kuribas: What are you planning to do with Common Lisp? Just learning for fun, or do you have some projects in mind?