freenode/#lisp - IRC Chatlog
Search
19:54:47
jcowan
beach: As usual, the mundane world is only now catching up to what the Lisp world has had for years
20:01:39
jcowan
Frankly, what you have hold of for Sicl is genuinely groundbreaking for a HLL. If I believed in software patents, and if you hadn't disclosed all over the Internet already, I'd say: patent it.
20:53:24
jackdaniel
point being made is that such patents are obstacles to getting things better (but may be a good idea to get wealthy) and I'm quite sure beach pursues better software and not a patent portfolio
20:55:12
jackdaniel
and as of 20y, it is enough to skip whole generation of people to work on something, so from a lifetime perspective it isn't "nope :)"
21:04:44
no-defun-allowed
jackdaniel: private property and personal property are distinct, usually disjoint sets though
21:05:43
no-defun-allowed
and well they call it intellectual property and put property laws on ideas quits often
21:11:57
jcowan
I said "if I believed in patents", which I don't. I mean that beach's idea is both original and useful, and it's not surprising that nothing like it appears in the literature
21:12:47
jcowan
(Actually, I believe that people who want patents and copyrights should pay heavily for them, preferably an annual fee.)
21:14:12
p_l
jcowan: a good patent system is a boon to innovation, but a certain patent system backed by significant military was designed more for stealing ideas and mercantilist blocking of foreign companies
21:15:56
jcowan
Patents are monopolies, and monopolists should pay for what they are (for sound economic reasons) allowed to deprive the rest of us of, to wit, the market value of the monopolized article.
21:16:59
p_l
jcowan: patent system origins in Europe were for monopoly-breaking by putting incentiving people to use patents rather than keeping things secret
21:17:34
p_l
because a proper patent should have all the details necessary to reproduce the invention patented + a reasonable time limit
21:20:52
p_l
beach: what was the "fast module"? I looked at scrollback but I'm missing some context and it seems interesting
21:21:57
no-defun-allowed
p_l: I think it’s not taking time to consider better solutions and going with whatever comes to mind first
21:23:35
jcowan
When I raised the idea of generic functions based on general (pure) predicates, he immediately raised the efficiency argument.
21:24:05
jcowan
In truth, people prefer and find intuitive, flexible, and efficient, what they are used to
21:24:10
p_l
as in, code that is too generic for the scope of the problem, causing increased complexity and thus loss of *human* performance in dealing with it
21:25:38
p_l
In general, my memory seems to recall mostly one somewhat common use case for defstruct in normal code (not implementation-code)
22:33:24
fiddlerwoaroof
It's a quick way of generating functions like point-x point-y when you're using vectors to represent data.
22:35:46
aeth
fiddlerwoaroof: I'd much rather generate them separately because in practice you don't want 2D, you want 2D, 3D, and 4D when talking about points
22:36:23
aeth
Well, a general purpose graphical program will wind up working with all 3 because of how the various APIs work.
22:36:26
fiddlerwoaroof
I'm generally not dealing with these sort of things in a context where it makes sense for me to go fully generally
22:37:14
fiddlerwoaroof
:type vector is a useful way to get better ways of accessing vectors than just (elt some-vector 4)
22:37:49
aeth
It's not as useful as it could be because it doesn't give you the type definition, which a regular defstruct gives you.
22:38:09
aeth
I use define-array-and-type instead: https://gitlab.com/zombie-raptor/zombie-raptor/blob/48a75d6b543950c3581e5f413be8bd5c4cf3a357/util/array.lisp#L58-71
22:39:21
fiddlerwoaroof
I don't write game engines, so the performance doesn't matter too much to me
22:40:24
aeth
A vector gives you a lot of options, e.g. I often find that it's most convenient to split them into multiple values.
22:41:02
fiddlerwoaroof
Anyways, my use case is mostly things like dealing with CSV of a predefined format
22:41:18
aeth
If you write your own representation, you basically force someone to handle it as a unique case with with-accessors even if it's not unique.
22:41:51
aeth
(which often involves just translating it into a vector, doubling memory usage and slowing everything down)
22:42:09
fiddlerwoaroof
See, the way I would handle that would be to define a protocol of generic functions that are specialized on both arrays and my classes
22:42:33
fiddlerwoaroof
And, if the user had other things thy wanted to use, they could define methods as necessary
22:43:07
aeth
You can't define a method that specializes on arrays of a certain length because that's something that's only in the type, not in the class.
22:44:52
aeth
Well, ctypecase/etypecase is how you do that sort of thing, but it will only work for functions/methods of one, or maybe two, arguments before it quickly becomes impractical.
22:44:54
fiddlerwoaroof
Anyways, I suspect that the subset of CL I use and care about is fairly different than yours :)
22:49:28
aeth
fiddlerwoaroof: Immutable vectors would actually be a good way to handle both use cases, assuming the compiler was smart enough to reuse the old "immutable" vector instead of copying where necessary (which would be very tricky, actually, because the compilers mostly work on functions as a unit). Then the vector could be generic and specific.
22:50:17
aeth
i.e. then you could just say (immutable-vector 1f0 2f0 3f0) and the implementation would make it a single-float vector since you can't store some other type in there.
22:50:30
aeth
If you say (vector 1f0 2f0 3f0) it has to be a T vector because you could do whatever you want to it afterward
22:53:39
slaterr
is there an immutable vector in standard CL or some popular third party library? and immutable collections in general
22:54:25
aeth
You'd probably want it to be done at the implementation level and handled with a portability library, like threads, if you wanted efficiency.
22:55:10
fiddlerwoaroof
Anyways, you could totally have (vector 2f0 3f0 4f0) return a specialized vector as long as you have a check on assignment
22:55:13
aeth
pjb: Incorrect. #(a b c) is a literal vector, where mutation is undefined and should not happen. However, it is not tagged as immutable, at least in SBCL, so once you cross the compilation-unit boundary it will be mutated, with undefined and undesirable results (i.e. if you set b to d, then it will be saved as d next time you start the program)
22:59:13
aeth
You can, however, safely treat #(a b c) and '(a b c) as immutable within a function, and should do so if that's what you want and it doesn't cross the function boundary. (compilation-unit/file is a bit trickier, but it could be safe there as well)
23:04:57
aeth
Tagging literals as immutable would be a nice implementation specific extension that could eventually solve the issue, though, afaik. It wouldn't look pretty but you *can* create them in functions, e.g. `#(a b ,c)
23:21:14
jcowan
I wouldn't count on the output of backquotes being immutable: they are code, not literals.
23:21:38
jcowan
(that is "count on" even in the sense that you might count on it in a Lisp system that makes literals immutable.)
23:40:32
Bike
well, it's immutable in that it's undefind to modify it. i guess a system could expand it into (IMMUTABLE-VECTOR 'a 'b c) or something so it's tagged even though it's constructed at runtime.
23:43:17
jcowan
Or adopt the Racket solution whereby default conses *are* immutable, and you have to ask for mutability explicitly. This was done fairly recently, and remarkably few programs had to be changed.
23:48:26
jcowan
http://blog.racket-lang.org/2007/11/getting-rid-of-set-car-and-set-cdr.html lists only four basic cases where people used the mutability of conses in practice: for alleged efficiency with nconc and nreverse, queues (easily replaced with explicit mutable pairs), alist updating (easily changed to a functional solution), and the use of conses as a handy 2-element struct.
23:49:13
jcowan
Of course from a standards perspective it can't be done, no matter how nice it would be. Racket's implementations of standard varities have mutable pairs.
0:29:35
pfdietz
If you wanted to create an immutable vector, then (eval v), or perhaps (eval (list 'quote v)), would do it. Perhaps one of the few good uses of eval.
0:31:17
Bike
i think if there were actual runtime-immutable structures it would probably be better to expose a function to make em
0:59:02
aeth
pfdietz: You don't need to eval, though. You can also write a macro to produce essentially the same result, which would be even more preferable.
1:00:56
aeth
Bike: You'd also want to expose the subtype because you'd need type declarations to actually allow the compiler to assume that they're immutable when you use something like car or aref. (Well, you could also just directly declare them, but that solution is messier than a type one.)
2:15:42
fiddlerwoaroof
jcowan: hmm, isn't there a fifth case where you want to append an element to a list in O(1) time?
2:17:44
fiddlerwoaroof
Sure, but the advantage of using mutable conses is you don't need a conversion to use the underlying list with the rest of CL
2:18:00
fiddlerwoaroof
you just need to make sure you update the tconc function before trying to append again
2:18:46
fiddlerwoaroof
I dunno, I appreciate the value of immutability (it makes certain things much more reliable) but I do think we don't think about the costs
2:21:09
pfdietz
aeth: how does a macro do it? I'm thinking of the case where the vector is not known at compile time.
2:33:24
jcowan
fiddlerwoaroof: No, I mean a structure just to hold the first-pair and last-pair pointers; the list itself remains just a list.
2:35:42
aeth
pfdietz: The general case, which does require everything to be known, seems to be (defmacro literal (thing) `',(eval thing))
2:37:55
pfdietz
What I was getting at was that as soon as something shows up as a literal in evaluated code, it becomes unconforming for a program to modify it. So an implementation could flag it as immutable, even if it had been created at run time, not compile time.
2:40:02
pfdietz
Another interesting game: a way to make compile time constants behave as if they were created with hash consing (so equal constant are eql).
2:47:40
jcowan
Knuth, author of "Structured programming with goto statements" (a great paper) has outlived both of them.
2:50:17
jcowan
It's freely downloadable from https://epdf.tips/structured-programming-with-goto-statements.html
2:57:39
pfdietz
Instead, when you do (equal x y), if this is true and x and y are not eq, then do (setf (car x) (car y) (cdr x) (cdr y)) (say). Each comparison increases sharing.
3:01:33
jcowan
Goto's paper is from 1974 and is called "Monocopy and associative algorithms in extended Lisp". Tokyo: University of Tokyo Technical Report TR 74-03. It might be possible for someone to retrieve it given that.
3:06:08
pfdietz
https://www.cs.utexas.edu/~hunt/research/hash-cons/hash-cons-papers/monocopy-goto.pdf
5:38:24
p_l
beach: I think I recall reading about the idea in the past. Not sure if it wasn't mentioned in Peopleware
5:40:54
beach
The basic idea from Kahneman's book is that the brain has two modules, one fast and one slow. The fast one is lousy when it comes to statistics and arithmetic, and the slow one is lazy in that it tends to believe the fast one.
5:42:41
p_l
beach: it curiously connects with the AI saying of "hard things are easy, easy things are hard"
5:43:44
beach
It is not terribly thick. It is easy to understand, and it gets you thinking about our activity and how people around us think.
5:57:35
elderK
shka__: After looking into the MOP, I'm thinking of still using defstruct (or defclass) and suitable macros.
5:58:33
elderK
shka__: Although, I'm still kind of undecided. A real issue would be having defstruct-style inheritance restrictions.
5:58:33
p_l
Meanwhile I'm enjoying my just desserts for laughing at a friend whose baggage was waylaid by airline
5:59:02
elderK
shka__: I might even side-step the entire issue and force people to do "structural inheritance" themselves via composition.
6:02:27
p_l
It seems that everyone who took that transfer was affected, since me and my two coworkers all are in the same predicament