libera/#commonlisp - IRC Chatlog
Search
5:10:14
hayley
...notably, the competitions where people churn out code as quickly as possible. Not all competitions are based on programming speed.
5:16:25
hayley
Make sure you have loaded the split-sequence system, and then (split-sequence:split-sequence #\space "this is a string")
5:17:07
hayley
I'd usually say something right about now, but I don't have functions that replace and split strings.
5:17:49
hayley
But, yes, CL-PPCRE performs operations on regular expressions, and not just strings, so e.g. splitting on "|" might go sideways quickly.
5:18:16
hayley
I recall my first university assignment involved parsing "database" files which were | delimited, just to throw people off using .split() in Java, which takes a regular expression.
5:19:59
hayley
Amusingly, I was just about to ask something about regexen implementation: somehow an article I wrote on my regular expression compiler got big on Reddit and Hacker News. Someone asked me how I would handle character classes like \w or [:alpha:]. I suspect generating a whole lot of <= for each range is a terrible way to match a character class comprised of many ranges.
5:21:25
hayley
Another approach would be to use a bitmap, but we'd need a lot of bits for every Unicode character. And the generated code is quite fast, so having a large table also would result in more cache misses and more of a slowdown, which would be unfortunate. Is there a clever way to "compress" a bitmap in a way that allows for random access to the bitmap?
5:22:26
hayley
dre: I assume the documentation assumes you have used the package, but that is not a good idea, so you need to include the name of the CL-PPCRE package. Try (cl-ppcre:parse-string "(ab)*")
5:24:02
hayley
Prefixing everything with the package is usually easier on the person reading your code, so I would just do that.
5:24:57
hayley
Not by much. And it's better if your editor can complete names, so (cl-p <tab> p-str <tab> "(ab)*") might suffice.
5:27:52
hayley
Here is a hackish implementation of a "page table" which avoids requiring parts of the bitmap that are entirely 0 or 1 to exist in memory <https://plaster.tymoon.eu/view/2740#2740>, but I would guess testing for the sentinel values could confuse branch prediction.
5:28:19
hayley
Hm, I could hash cons instead, and there would only be one fully 0 page, and one fully 1 page.
5:31:31
dre
if I then redefine the function ( correcting the mistake), and then "Ctrl-D" to get out of the debugger...
5:32:54
dre
but I'm evaluating the defun in the debugger, then leaving the debugger, so I have the old version right?
5:33:33
beach
SBCL has only one global environment, so if you evaluate the DEFUN form in that environment, the old function will be replaced.
5:35:05
hayley
There is SLIMV for vim, though I have heard mixed things about it. Granted, I have also heard mixed things about SLIME too.
5:36:39
dre
I use "vim-slime" which, very basically, will send the paragraph I'm on to *another-terminal* with a <c-c><c-c>
5:37:33
Nilby
or you could be like me and not use SLIME/SLIMV/SLY anything, and even more naughty, use :use/use-package
5:57:28
hayley
It might be better to use DESTRUCTURING-BIND too. e.g. (destructuring-bind (action distance-string) (cl-ppcre:split " " item) ...)
6:07:00
abrahms
Hey commonlisp folks. I'm trying to figure out how to call a function if I have the string representing it's name. (funcall (intern "func-name-here") 1) doesn't seem to work.
6:08:14
hayley
The reader upcases symbol names by default, so you probably need to upcase the name yourself.
6:09:35
Alfr
abrahms, no but it won't intern a new symbol into package if func-name-here is misspelled.
6:10:00
jackdaniel
beach: on master the same code (sans cells are aligned differently, but that doesn't matter here) -- https://turtleware.eu/static/paste/incrm-table-old.mp4
6:16:00
_death
often when I want to have such dispatch equal is more appropriate.. but I do use equalp sometimes, either for such case-insensitiveness or for non-string array equality
6:24:45
jackdaniel
beach: well, the spec is quiet about what does it mean to propagate changes, so not strictly a bug
6:26:27
beach
So was the behavior different before when incremental redisplay was in use, compared to when it was not?
6:28:38
jackdaniel
I've been fixing issues for situation when some record was redisplayed that was not top level
6:31:46
beach
Every day, there are fewer reasons to choose an FFI-based solution to Common Lisp GUI applications. :)
6:57:55
hayley
You didn't provide a variable name to set in the SETF forms that comprise the body of the last WHEN form.
7:24:20
abrahms
Is there a utility function that amounts to "Given <list>, replace the 4th element with <thing> and return it to me"? I've looked and I can't quite find one. rplacd is as close as I've come and it's a bit wonky of an API
7:27:12
abrahms
Close. It returns `50`. I tried playing around with setf in the repl, but it was very angry about replacing constant data.
9:51:42
mzan
beach: apart these "cosmetic" details, sadly: 1) the library series was not able to execute correctly the same code, but written in a slightly different way; 2) my code is not 100% stream-oriented, because it can not process a file of 30Mb. It is ok for 16Kb
10:13:06
beach
mzan: I did not study your code enough to understand what it does, nor the problem to understand what the code is supposed to do.
12:13:06
jcowan
hayley: a classic hacque for Unicode char classes is to keep a sorted sequence of ranges as a vector. Contains is binary search, where the index mod 2 tells you if the char is in or out. Union and intersection are O(number of ranges), and complement is O(1)
12:14:19
hayley
Interesting. I'm not sure if O(log n) for contains would be okay, but I've set myself unreasonably high standards for scanning performance so far, honestly.
12:16:16
hayley
I already have such a sorted sequence to represent sets, but I don't want to give the branch predictor a hard time. I guess I can do a binary search of fixed length branch-free though.
12:18:55
hayley
...or perhaps my two level table idea, which would allow reusing the same #*0101... subvector for each group of characters.
12:20:08
hayley
From memory, ALPHANUMERICP had some 550 ranges or so, thus 10 iterations of binary search. Not sure if that is too many.
12:34:23
pdietz
The distribution of inputs is likely highly nonuniform in practice, which would speed things up.
13:20:23
pjb
hayley: perhaps not, when dealing with random unicode characters. it can be optimized for the iso-8859-1 case. But instead of using a binary search, perhaps one could have an indexed search. Are those ranges very non-uniformly distributed?
15:02:00
mzan
beach: about my assertion "my code is not 100% stream-oriented, because it can not process a file of 30Mb. It is ok for 16Kb"
15:02:20
mzan
it is probably wrong, because I noticed that there are ways for instructing series to optimize the code.
16:51:29
_73
In SBCL when I try to compile my file with a `defpackage` clause that has an `import-from #:alexandria ...` clause I get an error "The name ALEXANDRIA does not designate any package". If I go to the repl and `(ql:quickload "alexandria")` then recompile the file everything works fine. Should I ensure that my libraries are loaded by editing my `~/.sbclrc` file, or is their a different way to load my dependencies? I have made a `.asd`
16:51:29
_73
for my project that mentions my dependencies but I don't know how to tell SBCL about it.