freenode/#lisp - IRC Chatlog
Search
17:13:42
_death
jackdaniel: I'm surprised ;).. I expected some resistance, at least for the draw-arrow stuff, if not the keybindings (which I supposed must have had some good reason not to be there in the last 20 years)
17:17:40
_death
jackdaniel: cool :).. I also had to patch the coordinates stuff, which currently has exact comparisons incl. on floats that causes trouble with ellipses, but I noticed the commented version and some old mcclim-devel discussions and some issues on github so I thought another approach may be on the queue
17:18:38
jackdaniel
I want to change the ellipse representation from parralelogram to something more stable (transformation-wise)
17:19:20
_death
yeah, that's one of things I gathered.. the exact comparisons may caused issues elsewhere too
17:19:58
jackdaniel
comparisons are one issue, but the current code can error because of a non-reversible transformation (due to rounding errors)
17:21:09
_death
right.. there are two issues.. the inversion is easy to reproduce with the Fig example, and the comparison is easy with https://www.artm-friends.at/rm/kytron/kytron-clim.html (after small tweaks to make it work)
17:30:21
_death
I also have some changes to scigraph, but it may be that it doesn't work right only for me.. I guess the most annoying issue right now is the repeated mapping and unmapping (with lots of match error 42) that happens if I switch windows in stumpwm, usually once per application frame.. also, (setf clim:*default-server-path* :clx) looks cool and retro :)
17:33:47
_death
(to make clear, this issue is not limited to scigraph.. it often happens with any arbitrary application frame)
18:36:18
albusp
Trying to get sly working with emacs, currently I don't have slynk running (no lisp process active), and indenting code in *.lisp files gives the error "Symbol’s function definition is void: sly-common-lisp-indent-function". I'm checking sly.el and others, and found a line in slynk.lisp mentioning the function: https://github.com/joaotavora/sly/blob/e927cdae984b2c3383e1e2358e37f1a4115b142e/slynk/slynk.lisp#L3996.
18:37:55
albusp
slynk is not yet running because it doesn't compile on abcl (yet - i'm trying to fix it)
19:06:26
contrapunctus
"Who needs DEFSTRUCT anyway. You can just use CAR/CDR." lol I had to do a double take here, until I read the previous message 😄
20:00:14
aeth
Everyone comes into Common Lisp for different reasons so there's no real one true way to represent something. If you really wanted to just use conses for everything, though, CL isn't really the right language for that because they're not optimized. (destructuring-bind is a very nice macro for handling conses, though)
20:30:18
aeth
I guess that is equivalent, but it seems less readable to me than the more verbose (let ((*print-case* :downcase)) (format nil "~A" 'foo))
20:32:33
aeth
I go back and forth between loving FORMAT and hating FORMAT so I'll probably use it in the future
22:06:55
no-defun-allowed
jmercouris: I think that if the result of evaluating X and X are equivalent, then you are saying that every evaluation has a fixed point.
22:07:56
no-defun-allowed
That could be the case in e.g. Miranda or Haskell, as e.g. [x, y :: z] could evaluate to [1, 2, 3] which evaluates to [1, 2, 3] but not any Lisp.
22:10:19
no-defun-allowed
If it were, then e.g. X should always evaluate to 'X. I won't make an example for transitivity.
22:17:12
no-defun-allowed
So it would be evident why "equivalent" has a particular meaning when used in the context of Lisp evaluation?
22:26:58
no-defun-allowed
(Actually, that is probably not even the case in Haskell or Miranda. We might say 2 and 1 + 1 are equivalent forms, but an evaluator for one of those languages might reduce 1 + 1 to 2, but not the other way around.)
22:29:39
sm2n
blah blah referential transparency, they are equal within the denotational semantics of the language
22:30:37
sm2n
in pure fp things are given their identity by their normal form under reduction, by church-rosser or related
22:56:16
phantomics
Hey all, wondering if there's a library that converts HTML-encoded characters like " to Unicode. Tried some HTML parsers that didn't do it and can't see anything to do it on CL package lists
23:13:56
raeda
The numeric encoding is the code point number iirc. SBCL has unicode lookup by code point and you might be able to use CL-PPCRE to find & replace
23:41:46
moon-child
no-defun-allowed, sm2n: no denotational semantics required, you can define equality strictly in terms of halting
23:43:07
moon-child
given two expressions e1 and e2 in some language L, consider the universe of hole-containing programs within L. For each of those programs, substitute each of e1 and e2 for the hole. If there's any case when e1 causes a halt and e2 does not (or vice versa) then the expressions are not equivalent
23:53:51
no-defun-allowed
This is somewhat more interesting than arguing that EVAL is not an equivalence relation.
1:18:30
sm2n
moon-child: what about a language like idris where all well-formed programs are guaranteed to halt?
1:21:43
moon-child
I don't think that definition is usually applied to non turing-complete languages
1:23:39
moon-child
the advantage of that definition is that it works for all turing-complete languages without needing to have any knowledge of their semantics beyond that
1:30:59
sm2n
or actually, moon-child, do you happen to have a reference that discusses this? I'd like to read more about it
3:13:12
lukego
Thanks everyone for the rigorous discussion of datatype definition styles yesterday. I reread the Serapeum docs from beginning to end to try and update my mental model. For really ad-hoc internal data structures I need to experiment with DICT/MATCH and with DEFUNION.
3:18:59
lukego
Maybe DEFCLASS verses DEFCLASS-STD (etc) is a false dichotomy and really there are a lot of different contexts for defining datatypes that each call for a separate mechanism. kinda like IF and WHEN and UNLESS and so on.
3:19:54
lukego
I notice though that all this obsessing about how to define datatypes has not actually caused my broken program to start working and maybe I should try a different approach to that problem...
3:40:43
beach
I completely misunderstood the context and thought lukego and jmercouris were talking about the use of these operators in more-or-less final code, but it became clear that they meant the use in code that is highly likely to change, to be rewritten, or to be deleted entirely.
3:41:57
lukego
beach: I am feeling less provoked by your "if you don't care about X" comments when I read that as "when you are not immediately concerned about X in your present context" rather than "when you are a bad person because you don't give X due respect" :)
3:43:21
beach
lukego: Sure, that's a good interpretation in your case. Not so with many others who come here and who have no idea about elementary software engineering.
3:44:11
no-defun-allowed
fiddlerwoaroof: Yes, you're supposed to use generic functions, i.e. no defun. Cancel out the two negatives, and you have only fun.
3:44:40
lukego
it's a new revelation to me now though that there are a bunch of other macros, e.g. DEFCONSTRUCTOR from Serapeum, that actually capture the context i.e. that is something that you only use for a quick and simple local representation of immutable structures.
3:45:33
fiddlerwoaroof
And, what I've noticed, is that almost all "functional" programming languages use constructs that are OOP in CLOS's sense
3:46:08
fiddlerwoaroof
Clojure's multimethods are just a bad version of CLOS and Haskell has typeclasses everywhere, which basically are a compile-time version of generic dispatch
3:46:15
lukego
and that puts me off defclass-std as being "yet another defclass" rather than something complementary that's tailored to a more specific use case.
3:46:47
beach
fiddlerwoaroof: You must have missed the general consensus here in #lisp that you should avoid generic functions since they are bad for performance.
3:48:45
lukego
I liked splittist's comment that the rest of the world is built in Javascript these days so there's nothing particularly indulgent about using all the generics and indirections you please. Chrome has reset the bar on what is appropriate resource utilization by software and we can all rejoice in our relative thrift :)
3:49:42
fiddlerwoaroof
Like, I think it's probably hard to right a compiler for a dynamic language that comes close to V8
3:49:51
beach
lukego: Facts like that don't seem to prevent eternal discussions about performance. Not to mention the size of executables.
3:51:18
lukego
fiddlerwoaroof: so much the better :) writing slow code is contributing to computer science by stimulating compiler research, just look at javascript...
3:51:35
fiddlerwoaroof
The great thing about CL is that I find I can just write CL in most situations where I'd use FFI in Python
3:51:48
fiddlerwoaroof
Not to mention actually being able to benefit from multiple threads of executin
3:52:32
beach
The more I hear about Python (the language) the more I think it's a joke, and the more I am totally baffled why anyone would want to use it.
3:53:27
fiddlerwoaroof
Also, it's relatively quick to go from nothing to a proof of concept in Python
3:54:40
lukego
I like that "I must program as inefficiently as possible" mantra. that it's healthy mental exercise to burn CPU cycles and you should strive to do it as much as you can get away with.
3:55:56
lukego
or maybe we should fight to get our own code a respectable share of our CPU's cycles relative to e.g. Chrome and the idle loop :)
3:56:33
fiddlerwoaroof
I don't take a program seriously that doesn't pin at least one CPU core and consume 4GB of RAM
3:59:31
lukego
(also my code is working now and it's massively improved compared with the previous messy version so thanks everybody who helped me pick the right color for my bikeshed, it worked out in the end)
4:01:00
lukego
I really notice that after a break from Lisp hacking it takes a while to reabsorb all the old idioms and learn new ones. a bit like taking a break from speaking english. big languages full of nuance that are always evolving.
4:01:23
beach
I am reminded of the remarks by several students in the past when they were given a bad grade on some programs: "But it works!!!".
4:32:59
no-defun-allowed
beach: From memory, the marking system at my last university was predominantly marking what ran. Who were you teaching?
4:38:40
beach
Final year undergraduates and first year masters students. The message was always that a program that works but that is unmaintainable is useless because it must be thrown away when the requirements change, but a program that does not work but is maintainable can be made to work more easily.
4:39:10
beach
So we read the code of each program and graded (marked) it according to these criteria.
4:40:01
beach
I am totally sure that this is still the case for the masters students, because I know the person running that course very well, and we share the same values when it comes to software development.
4:43:46
beach
It was a lot of work, of course. But more to the point, this kind of grading requires the teachers to be competent in software development, and that is typically not the case when they are hired, as I have already explained. So these teachers had to invest a lot of time reading and writing code, books, and articles about software development.
4:44:48
beach
And that time was not explicitly paid. In fact, by spending that time on teaching rather than on some narrow research, their careers were often delayed.
4:47:18
fiddlerwoaroof
I've always thought that the way universities have seemed to unified research professors and teaching professors is bad for everyon
4:48:12
moon-child
fiddlerwoaroof: I think the theory, at least, is to avoid 'those who can't do teach'
4:48:46
beach
fiddlerwoaroof: Not usually. Take mathematics or the sciences (physics, chemistry). The undergraduate teaching doesn't require them to keep up, or to acquire skills from industry. The material is the same from one year to another.
4:49:23
beach
The problem is that the computer science programs accepted to take on the teaching of programming and software development.
4:49:33
lukego
I approach software development more like the way people advise writers to write. lots of drafts and rewrites and darlings and murders and so on. but desired end result is still the same as people who do things right first time.
4:50:03
beach
If they had stayed with theory, like computability, complexity theory, etc. There would be no problem.
4:50:32
lukego
I often don't even compile my first version of a program before rewriting it - just dump it out into emacs to organize my thoughts - so I really don't want to spend cycles thinking about optimization or maintainability or even syntax errors in that context.
4:51:44
fiddlerwoaroof
So, my background is mostly in the humanities (grad school and undergrad): but, my experience there was that the professors who were really good at research often weren't great to have as a teacher while the ones that you wanted to teach you often weren't the people who are famous for their ideas
4:52:50
lukego
beach: mostly just reflecting on friction in the discussion yesterday, specifically realizing that when I'm in "rough first draft that won't even compile" mode I'll naturally be at odds with your advice about how to write clean code that will pass formal review.
4:52:55
beach
fiddlerwoaroof: The problem in software development is that we have no good way to select knowledgeable teachers.
4:53:44
no-defun-allowed
(...to which I think Joe Armstrong nailed the apparent decision between performance and good design with "Make it work, then make it beautiful, then if you really, really have to, make it fast. 90 percent of the time, if you make it beautiful, it will already be fast. So really, just make it beautiful!")
4:54:11
moon-child
imo 'make it fast' is a misnomer. There is no fast code. There is slow code, and if code is slow then it bears to make it not slow
4:54:20
lukego
beach: and I guess that there are different kinds of advice about how to write good code. one kind focuses on what the result should look like - clean interfaces, etc - and the other focuses on the process - should have been rewritten at least N times and be only 1/Mth its original line count
4:55:19
fiddlerwoaroof
lukego: I generally write the code you're talking about as drafts in the repl
4:55:51
fiddlerwoaroof
After I'm fairly satisfied with a solution, I copy it into a file and generalize
4:56:07
lukego
fiddlerwoaroof: I'm becoming more extreme over the years. I can easily spend several weeks writing draft code that never compiles. I wouldn't do that in the repl
4:56:20
no-defun-allowed
Or at least, I think my "fast code" is relatively nice, because it uses the right data structures and algorithms and whatever else that quiche-eater Nicholas Wirth probably said was good.