freenode/#lisp - IRC Chatlog
Search
22:14:56
dim
if I (push :pgloader-image *features*) from a file where then I call sb-ext:save-lisp-and-die, should I expect the image built as a result to have #+pgloader-image?
22:34:04
dim
basically I want some handler-bind, lparallel:task-handler-bind and handler-case to act differently when in an interactive SLIME session and when in an image, to help me with debug facilities (empty condition handling) and to print something non-interactive when /usr/bin/pgloader is being used by a non CL developer
22:34:34
dim
seems I'm missing some things here and there still in the new save.lisp that I intend to use instead of buildapp when it's ready
23:52:11
sjl
Is there something like POSITION-IF that would give me a list of ALL positions that satisfy the predicate, instead of just the first?
23:52:26
sjl
(I can (already have) easily write my own, just wondering if there's something clever built-in I could use)
23:58:15
sjl
I think http://paste.stevelosh.com/8f7bed46c7fb4ca8bf8038741ed6f7e3bb4a6261 is probably good enough for what I need
0:18:03
verisimilitude
You can simply MAP the predicate and then have a SEQUENCE of where it does and doesn't aply, sjl.
0:19:03
verisimilitude
You could easily transform such a SEQUENCE into positional numbers or skip this intermediate step entirely.
0:21:14
sjl
Preferably it should use O(elements that satisfy the predicate) memory too, though I could live without that
0:21:52
sjl
Mapping the entire thing and transforming will allocate memory even for stuff that doesn't satisfy the predicate, which is a waste if only a couple of things do
0:23:51
verisimilitude
I write LOOP assuming COLLECTING is O(1), which any decent implementation would use.
0:24:36
sjl
But yeah, I'll just use my util function that I pasted earlier. It's efficient and works
0:24:44
verisimilitude
This is, again, just a basic implementation, of course; it works for what you want.
0:24:52
sjl
and it's not like I don't already have a giant utils library. what's one more function thrown on the pile
2:58:59
alandipert
is there a way to define a local function that has the function value of some expression? so that it can be called locally without funcall
3:01:39
alandipert
i was hoping to avoid funcall/apply but hey, this is CL, i need to learn to love lisp-2 :-)
3:02:11
verisimilitude
You could get away with using a symbol macro for this, I suppose, depending on what precisely you're doing.
3:02:32
alandipert
actually i think i figured out a more elegant way that doesn't need require doing this
3:21:07
psq
or perhaps I shouldn't worry about "approachability" and just go for what seems interesting?
3:22:05
verisimilitude
Alright; I have a well-documented terminal control library written in pure Common Lisp in less than one thousand lines.
3:23:36
verisimilitude
I've also written it to assume nothing about the character set the implementation uses, so it performs some tests for suitability and optimizes in the case of ASCII.
3:24:31
PuercoPop
pfdietz: Been skimming over the fuzzy-testing code in your ansi-test repo. Pretty cool. One question, what would 'something useful' on package errors be? build a list of the symbols that caused the package errors?
3:25:45
pfdietz
For the reader, it would suffice to have a restart so the code invoking the reader could suggest a package.
3:26:37
pfdietz
The goal of that was to stripmine a large corpus of Lisp for forms that are sort of reasonable.
3:27:10
pfdietz
And then mutate those and recombine them and throw them at the SBCL compiler, trying to get the compiler to signal errors.
3:29:44
pfdietz
I pulled in code from the entire quicklisp distribution and a bunch of other public lisp programs.
3:37:25
pfdietz
I would have liked to have read everything in the actual packages, but that's not possible if I want to read all of quicklisp, as there are many package name collisions.
4:24:43
beach
Commented-out code gives a very strange impression. What is the person reading the code supposed to think?
4:26:55
beach
Comments inside top-level expressions to be aligned with other expressions take two semicolons.
4:27:49
beach
Instead of using reader labels #= and ##, define an abstraction like a function or a macro. Code like that is quite unreadable.
4:29:59
beach
verisimilitude: I think it was a mistake to recommend your code as the first code for psq to read.
4:31:34
verisimilitude
ACUTE-TERMINAL-CONTROL is still a work in progress, but I will defend CL-ECMA-48 as something that is rather finished and good.
4:32:06
beach
verisimilitude: Why do you recommend unfinished unidiomatic code to read for a beginner?
4:32:56
verisimilitude
I recommended ACUTE-TERMINAL-CONTROL because they also wanted something interesting.
4:33:36
verisimilitude
I told them to read CL-ECMA-48 first, anyway; do you have any criticisms that apply to that, beach?
4:34:55
equwal
versimilitude: Because you need version control and git is the best version control system.
4:35:25
beach
verisimilitude: Your code seems to use car/cdr/rplaca/rplacd a lot. That indicates a lack of abstraction.
4:35:58
verisimilitude
The code in DEFCS could be cleaned a tad by introducing more variables to store some results, and I may do that, but it's still fine and nice.
4:36:01
beach
verisimilitude: They are not irrelevant. If you want to expose your code to others, especially to newbies, make sure you follow the established conventions.
4:37:20
beach
verisimilitude: I respect that, but then don't expose your code to others. Especially not to newbies.
4:37:57
beach
verisimilitude: It would be better to wait for a more idiomatic recommendation than to expose unidiomatic code.
4:38:06
equwal
verisimilitude: I don't have recommendations because I'd rather use my time doing something other than reading that.
4:38:44
verisimilitude
That's what the code actually looks like, equwal, and the actual program isn't written like that.
4:39:00
beach
psq: If you could tell us your current level of knowledge, the kind of code you would be interested in, and what other languages you already know, better recommendations could be given.
4:40:36
alandipert
i have a cyclic relationship between a struct and its :print-function (the print function uses accessor functions created by defstruct). is a "forward declaration" like (declaim (ftype (function (t t t) t) print-node)) the most reasonable way to muffle complaints about undefined functions?
4:41:01
equwal
Best recommendation: Make a git repo, put your code in Emacs, M-x downcase-region the code.
4:41:30
verisimilitude
Again, the actual cl-ecma-48.lisp isn't like that, equwal, if you'd actually look at it.
4:42:10
verisimilitude
I'd rather rid myself of torvalds' software than become more dependent on it, equwal.
4:42:28
Bike
alandipert: i think you should just be able to (defstruct ... (:print-function foo) ...) (defun foo ...) and that will be fine
4:43:18
minion
psq: have a look at PCL: pcl-book: "Practical Common Lisp", an introduction to Common Lisp by Peter Seibel, available at http://www.gigamonkeys.com/book/ and in dead-tree form from Apress (as of 11 April 2005).
4:43:28
alandipert
Bike thanks, that works, but sbcl emits a style warning about the undefined function that i wish to suppress
4:44:05
beach
psq: I seriously think you should skip the code that verisimilitude recommended. It is not idiomatic and verisimilitude doesn't think it is important to follow established convensions.
4:44:34
beach
psq: But to a beginner, it is absolutely essential that the code follow established convensions.
4:44:34
alandipert
oh, duh, they're in the same file but i'm not loading the file. i'm evaling things form by form manually in slime
4:45:07
beach
verisimilitude: You don't get it do you? It is not about your taste. It is about established conventions.
4:45:14
verisimilitude
You can read my program and see a rather finished, well-documented, well-used, and entirely portable Common Lisp library or you can follow the vague suggestion to read programs in a book, with no particular examples, psq.
4:45:58
psq
beach: I've looked at the books, I was thinking more along the lines of a project that I could wrap my head around
4:46:25
verisimilitude
Well, I still recommend my programs, psq, although I'm not looking for contributions.
4:51:12
beach
psq: Here is a library I am fairly proud of: https://github.com/robert-strandh/Cluffer
4:53:11
no-defun-allowed
would it be a good idea to split out any protocol defining code like defgenerics into another file?
4:53:39
beach
verisimilitude: What source did you use to determine the idioms of Common Lisp? Since you don't agree with my assessment, that means you think your code is idiomatic. Or do you think you are so good that you can establish the idioms yourself?
4:53:46
psq
Thanks for the suggestions, I'll check them out. I'd love to get into SBCL, I have a feeling I'll have to work up to that though
4:54:17
beach
psq: Yes, that might be tricky. If you want some compiler code, Cleavir will be easier to understand.
4:54:58
beach
psq: Check the Code/Cleavir subdirectory of SICL for that: https://github.com/robert-strandh/SICL
4:57:46
verisimilitude
I think your bemoaning my comments is irrelevant, considering there's few of them and the conventions you mention are, at best, a suggestion mentioned in passing.
4:59:11
verisimilitude
If you look at the original question, psq asked for ``approachable'' codebases.
5:00:12
verisimilitude
You're talking about the examples I gave in the documentation, no-defun-allowed?
5:01:21
no-defun-allowed
and if you're going to call xterm r*tarded you should do it at the bottom of the docs preferably in a low-contrast colour scheme
5:02:27
verisimilitude
I will concede that, at least at this point, ACUTE-TERMINAL-CONTROL isn't necessarily approachable, sure.
5:03:00
verisimilitude
I think CL-ECMA-48 is fine, though; I have five macros that do all of the work and everything's well-documented.
5:12:57
aeth
I think it's a lot clearer to use (list) (destructuring-bind (foo) list ...) instead of (list &aux (foo (car list)))
5:14:45
aeth
I don't think &aux should really be used. It doesn't even save a line in most cases. If your lambda-list is too long then each element should be on its own line so (... &aux (foo 42)\n(bar 43)\n(baz 44)) doesn't actually give you more lines over just having a let.
5:15:39
aeth
So you actually use one *more* line over the let, although you do have less indentation and one fewer level of parentheses
5:17:19
verisimilitude
If I'm to choose between a LET* to start the body with or an &AUX, I'm always going to choose the latter.
5:18:21
verisimilitude
It usually does save a line; can be considered more clear since you no longer need to see if the LET* applies to the entire body or not; and it does result in less indentation, which is good.
5:19:02
aeth
It only saves lines if you use your horrible style of (foo bar baz foobar\nquux foobarbaz barfoo) multiline lambda lists that should fail any code review.
5:19:06
verisimilitude
You can make the argument that properly-indented code does make it easy to see if a LET* always applies, but with an &AUX it doesn't matter if the code is well-indented; you know it applies to the entirety.
5:20:14
aeth
&aux encourages function-level scope for variables, which should be used as rarely as possible. Everything should have the tightest scope possible.
5:20:42
aeth
The latter behavior really makes it easier to refactor into smaller functions is a function grows too big
5:22:39
aeth
I just did a search and only a handful of libraries seem to use &aux (including stumpwm, unfortunately)
5:22:44
verisimilitude
If you're referring to the functions my DEFINE-CONTROL-FUNCTION generates, then there's clearly no need to refactor, since they're all automatically generated, and all I use the &AUX for is some special variables that are harmless to bind like this.
5:23:45
verisimilitude
I'm not insulting you, but I do find it a tad odd to not be aware &AUX exists and then to decry its usage.
5:24:34
verisimilitude
I learn languages by mostly reading standards and reference material beginning-to-end, so I don't tend to use a language until I'm at least well acquainted with all or most of it.
5:24:54
beach
verisimilitude: I would like to know YOUR source of idioms since you claim your code is idiomatic.
5:25:09
verisimilitude
So, what I mean is I never used CL:LAMBDA without being aware of &AUX, I don't believe, or at least not for long.
5:25:32
aeth
When people very familiar with the language have lack of familiarity with a feature, it might mean that that feature is discouraged idiomatically, like PROG or &AUX.
5:26:23
verisimilitude
I really don't see what's particularly unidiomatic about my programs, beach. All I'm doing is using what the language provides.
5:26:27
aeth
I learn by reading and writing a lot of code. If I've never encountered something at this point, that probably means that (almost) no one uses it.