freenode/lisp - IRC Chatlog
Search
3:12:18
beach
hegz: #lisp is not really for truly basic questions, but they are tolerated. If it gets too lengthy, you might be redirected to #clschool. What are your plans with respect to Common Lisp? Write applications? Just play around? Something else?
3:18:02
beach
Thought I guess there are some questions that are "truly basic" but where the answers won't hurt to be repeated here, like the semantics of argument passing and how lists are represented.
3:26:54
hegz
beach I'm still not sure whether I will dig deeper into CL or not tbh, my journey with lisp was mainly me reading SICP and I was kinda surprised this channel is specific to CL but not lisps in general haha
3:28:12
beach
I see. Well, SICP is a nice textbook for genera ideas about programming, like encapsulation, etc. But the style of object-oriented programming in SICP is not as practically useful as CLOS.
3:31:11
beach
hegz: There is ##lisp for general Lisp discussions, but since there is no widely agreed-upon definition of "Lisp", I imagine the discussions can become strange. That's part of the reason I am not in that channel.
3:37:36
hegz
beayeahch yeah, the main reason that drove me into starting with SICP was the approach to programming in general and you get to learn scheme as a bonus haha.
3:37:45
Nilby
hegz: One of our lispers has written a Scheme in CL in case you want to do both at the same time - https://gitlab.com/mbabich/airship-scheme
3:41:01
hegz
<Nilby "hegz: One of our lispers has wri"> Lispers seem to love porting stuff don't they haha
3:43:23
Nilby
Yes they do, myself included. Once you have a CL environment that you like, it's hard to go back.
3:43:53
raeda
no-defun-allowed: Are you saying that nobody's made a self-hosting CL interpreter yet?
3:44:53
no-defun-allowed
A self-hosting interpreter? SBCL has an interpreter written in Common Lisp, but there aren't any full Common Lisp systems written entirely in Common Lisp (including garbage collector, operating system interface and so on).
3:45:13
beach
raeda: Modern Common Lisp systems don't have an interpreter at all, so it is entirely possible that nobody did that.
3:47:36
hegz
does it have something to do with the application or is it just entirely opinionated tastes.
3:48:31
beach
hegz: The condition system is unique, as is CLOS. But, again, there is no widely agreed-upon definition of "Lisp", so it is unclear which these "other lisps" might be.
3:49:32
no-defun-allowed
Common Lisp is a programming system, most other Lisp languages are just that.
3:50:08
Alfr
Hm ... i guess, getting away from C also would mean to implement handling systems calls.
3:51:30
moon-child
Alfr: system calls are not difficult. The challenge is that few systems have a stable syscall interface
3:51:51
beach
raeda: I suggest a compiler instead. It will take a bit longer, but it will be more useful.
3:52:17
no-defun-allowed
My personal opinion is that CL has more in common with Smalltalk or Self than some other Lisps (though it is hard to make a case with Scheme, I dunno).
3:54:11
Alfr
no-defun-allowed, in scheme you have call/cc and thus you can easily get green threads. (I think you were complaining the lack thereof recently.)
3:54:16
no-defun-allowed
The language is designed around interacting with an image, and there are facilities to make it work nicely in the language and its implementations.
3:54:20
beach
Alfr: System calls are messy either way. I have a long-term project for defining an implementation-independent protocol for POSIX and Linux system calls.
3:54:55
no-defun-allowed
Alfr: But then you also have call/cc and apparently if you breathe on it hard, you get performance problems. Don't get me wrong, I find it fun, but everyone else seems to think it's a bad idea.
3:56:08
no-defun-allowed
All that is necessary is a one-shot undelimited continuation, not multi-shot. And that is basically just a copy of all the registers of the thread, which is what operating systems use already.
3:59:38
Nilby
Even C isn't always exactly self-hosting as people thing. Ironically a popular C compiler has some tricky bits in a Lisp-like language.
4:01:06
no-defun-allowed
There is a .pd file with some S-expression stuff (pd for pattern dispatch?) and it is used for partial evaluation of C code.
4:01:40
beach
Nilby: RMS opted for a free version of Unix, rather than a free version of Genera, for political reasons. And he was right. If I had been in the position of RMS at the time I would have made the wrong decision.
4:01:51
no-defun-allowed
https://github.com/gcc-mirror/gcc/blob/master/gcc/match.pd Hm, yes, this is Lisp.
4:02:32
no-defun-allowed
Funny how I say that so-and-so clearly isn't Lisp, but then say I don't care because a language which just passes the definition doesn't interest me.
4:04:01
moon-child
no-defun-allowed: is that really lisp? I see quite a lot of c syntax, which would seem to indicate that's an sexp shim
4:04:33
Nilby
beach: I think it was also that he already had Emacs running on unix, and finding people who could write unix utilities is much easier than finding people to replicate Genera.
4:05:39
beach
Nilby: Yes, that's what I meant by "political reasons". His idea would have been a failure if he had chosen something other than Unix to copy.
4:06:43
beach
Nilby: But that must have been a very hard decision to make. Knowing that there is something better, but choosing the worse alternative anyway. I remember his phrase "Unix is not great, but it is not too bad".
4:08:19
Nilby
Exactly. I guess that's why we're still using Emacs as the top half of most of our current CL environments.
4:24:04
no-defun-allowed
I thought he didn't like keyword arguments at least, and this was from a presentation at some Lisp meeting in 2005.
4:24:40
no-defun-allowed
https://www.gnu.org/gnu/rms-lisp.html is a transcript of RMS at ILC 2002 rather.
4:25:41
no-defun-allowed
"I don't mind if a very complex and heavyweight function takes keyword arguments. What bothers me is making simple
4:25:41
no-defun-allowed
basic functions such as “member” use them." Fine, write a simple definition of object equality first.
4:25:49
Nilby
beach: Yes. It's interesting to see his votes and opinions on the CL committee. And funny that only after he's backed off does Elisp get nice things lexical scope.
4:30:02
Nilby
And funny that Gosling doesn't get more credit for writing most of the C code in the first versions of GNU+/Emacs, even if he made the worst lisp ever.
4:38:32
Jachy
I'm still amazed at how prolific Stallman was just in keeping up with a dozen already prolific Symbolics hackers in duplicating so much of their functionality for LMI.
4:45:17
Nilby
Jachy: It's quite impressive, but it's sad that LMI eventually got hopelessly behind, and maybe it more explains why rms ragequit to work on unix.
4:49:28
White_Flame
the complaining about heavyweight arguments is certainly one of a snapshot in time, before compilers could do a whole lot more to statically eliminate things
4:49:52
Jachy
Xerox indirectly spawned many things. Imagine if they hadn't pissed rms off by not giving them its source code
4:51:33
Nilby
I'd like to peek at the alternate universes without a pissed off rms, or with a sucessful Symbolics.
4:53:40
White_Flame
if Symbolics and Commodore had merged to bring lisp machines to the masses, I'd be quite a happy camper
4:56:03
no-defun-allowed
I read they were supposed to have a cheap Lisp chip in 1985, but that didn't happen.
5:00:49
beach
I think we can do something better than Genera. In today's world, we need more security anyway. And Lisp runs just fine on stock hardware today.
5:01:23
beach
We have better garbage collectors, and better compilers. And we now have a great native GUI library.
5:16:46
fiddlerwoaroof
Shinmera: do you happen to have documentation about issues with PARSE-NAMESTRING?
5:17:22
fiddlerwoaroof
I've found that using parse-namestring and a combination of MERGE-PATHNAME and MAKE-PATHNAME, I can get pathname behavior that's consistent enough across-implementations for most of my purposes
5:36:00
fiddlerwoaroof
I'd still like to see URLs specified the way PLNs have been, and for them to subsume most of the pathname stuff
6:16:44
Shinmera
fiddlerwoaroof: parse-namestring is hairy due to wild pathnames. So stuff like [], *, and others (implementation dependent!!) may need escaping.
6:20:08
Shinmera
implementing an analog to uiop's parse-native-namestring is on my todo for pathname-utils (and has been for years)
6:20:24
fiddlerwoaroof
I think it'd be useful to take the CLOSER-MOP approach with pathnames, really
6:21:10
fiddlerwoaroof
Specify the edge cases of the standard, and provide a package that implements that specification and a package that shadows the appropriate CL names
7:00:53
pjb
fiddlerwoaroof: or, having identified the edge cases, and specified them, patch the open source implementations so they behave the same on the same platform, and push so that commercial vendors implement the same.
7:01:22
pjb
fiddlerwoaroof: we have a strong position here given there are more free implementations than commercial ones.
7:01:52
pjb
fiddlerwoaroof: but remember: pathnames depend on the platform and the file systems that are mounted (depending on how the platform deals with them, check the mount options!)
7:07:10
pjb
fiddlerwoaroof: for logical-pathnames, see https://github.com/informatimago/check-pathname/blob/master/check-pathnames.lisp
7:09:30
pjb
fiddlerwoaroof: in general the problem is not so much that CL leaves things up to the implementations (there are a variety of platforms), but that there have not been defined a set of substandards specifying things for specific platforms. eg. how to deal with pathnames on MacOS, on Unix, on MS-DOS, on MS-Windows, on VMS, on Multics, etc.
7:13:26
Nilby
fiddlerwoaroof: The outputs of check-pathname for the various systems is very detailed answer to your original question.
7:17:46
Nilby
Now we just have to pipe the output from check-pathname on all systems to the automatic implementation fixer and we're nearly done.
7:20:13
Nilby
But my opinion is that the CL pathname stuff is written for a world which doesn't exist anymore, if it ever did, and there is a much simpler protocol that will cover all filesystems currently in use.
7:23:04
pjb
Nilby: granted. But AFAIR, only for soft specifications items. Eg. the specification mentions the customary case, but this customary case doesn't depend on the platform but also on the file system mounted, and platforms that can mount different file systems can (or could) deal with different customary case. In the same pathname! (ie, per component).
7:23:41
pjb
Nilby: but for hard features, such as the structure of paths in components, the hierarchic directory structure, etc, it's about good.
7:24:36
Alfr
I don't think pathnames support forks. (Not that it's a good idea to use them in the first place.)
7:24:38
pjb
Nilby: eg. the distinction between directory and file pathnames, even if it's not so clear-cut in POSIX pathnames, is still enforced in POSIX (eg. opendir vs open, or rmdir vs rm for files).
7:26:14
pjb
Well it's unrelated to pathnames. It'd be a parameter for OPEN. Since OPEN takes key arguments, it's already ready for an extension to specify what fork you want to open.
7:28:09
pjb
Alfr: the only place where it could be visible in pathnames, is when you map file systems with forks on unix (thru a mount), and they're translated in the path /mnt/fs-with-forks/example-file/data-fork when example-file is a file with fork, not a directory.
7:28:52
Alfr
Hm ... that'd be a solution, but conceptually I'd still think it rather belongs to pathnames.
7:29:30
pjb
Alfr: but in practice mounting Apple file systems on unix can use the apple-double or apple-triple format, which use alternate files with extensions: /mnt/apple-triple/example-file{.data,.rsrc,.info} /mnt/apple-double/example-file{,.rsrc}
7:30:11
pjb
This can be dealt with relatively easily with CL pathnames (the only thing to specify is how to deal with multiple dots in the file name.
7:32:41
pjb
But in reality, aren't files with forks exactly that: directories? Like "file packages" on NeXTstep/OpenStep/Cocoa/macOS/iOS ?
7:33:19
pjb
So again, but depending on the target filesystem and platform, this can be dealt with by CL pathname without difficulty.
7:37:20
Nilby
splittist: Yes, there's already a lot of CloudFS things, an they seem to usually use URLs or even more complicated things. I personally dread having URLs a file names. But there seems to be an opportunity for a more encompassing "resrouce locator"/filename library.
7:39:01
Nilby
pjbj: I'm pretty sure old MCL (and probably ccl now) could open resource forks, even on pre-unix MacOS.
7:44:27
Nilby
I think ms-windows is an example of how the more complexity you put into file names, the more problems you'll have.
7:44:48
Alfr
pjb, hm ... maybe name and type being :unspecific? I don't think there's anything in 19. prohibiting this.
7:47:47
flip214
At a first glance, I'd guess a subclass of PATHNAME that includes eg. a SCHEME (like :HTTPS) and a PORT (443) might be a reasonable approximation for many uses....
7:49:06
flip214
Though, as soon as LOAD can OPEN such beasts directly, we're back at square one (security-wise - see https://www.php.net/manual/en/wrappers.php)
7:55:43
pjb
flip214: granted, we have enough places to run code in lisp, not to add one in file names…
7:58:07
Nilby
Yes, internet file names seems quite scary and insecure. I would wish it would be something that the operating system could manage in a more secure way.
7:59:24
engblom
In the first chapter of Practical Common Lisp there is a simple database made out of lists. In it remove-if-not is used for quering the database. If you know there will always be only one occurence, it seems to be a bit wasteful to filter the whole list instead of just finding the first (and only) occurence. What could I use instead?
8:08:22
pjb
engblom: also, sometimes you will want position (position-if vs find-if), so that you may mutate the slot.
8:12:19
engblom
In my case I have a list of lists. Each sublist is a keyed list like this: (:ip x.x.x.x :port xx :user x :password x). Given an ip I need to find the rest of the settings.
8:15:20
engblom
jdz: I will getf for getting each of the settings out, but to find the right plist I still have to use find?
8:15:46
pjb
(let ((entry (find ip lol :key (lambda (entry) (getf entry :ip)) :test (function ip-equal-p)))) (getf entry :password))
8:20:09
engblom
jdz: I was thinking to use string=, but as you put there ip-equal-p I was just wondering if a such function actually already exists.
8:20:50
jdz
engblom: I've started writing an IP address library, but it lacks IPv6 support, and I'm undecided about many implementation aspects: https://github.com/jdz/ip.
8:22:12
jdz
engblom: You should define IP-EQUAL-P as (declaim (inline ip-equal-p)) (defun ip-equal-p (a b) (string= a b)) until you have something better.
8:22:27
no-defun-allowed
contrapunctus: I should admit to not having read the question, and I had assumed Shinmera typed find into the wrong buffer. Maybe "found it!" would have been a more direct response.
8:22:46
engblom
In this case I am sure the string= is enough thou, because the ip that is looked for is actually originally from the same plist, so there will never be cases where I need to handle comparing 192.168.1.1 to 192.168.001.001
8:27:46
flip214
well, IMO any IP comparision has to be done in the binary (or integer) representation, and should take optional netmasks anyway.
8:32:18
pjb
IP address comparison may be complexified by the fact that there exist 2 kinds of IP addresses (IPv4 and IPv6) and several representation variations. So it's better to abstract it away with a function.
8:33:15
pjb
engblom: In some programs too, domain names can be used interchangeably with IP addresses (DNS resolution being performed automatically).
8:33:51
pjb
But since a domain name may correspond to several addresses, the comparison is not a mere =, but rather a set intersection…
8:46:49
phoe
pjb: I think that DNS lookups and comparisons are a slightly different topic; munging IPs on their own is easy because they can be treated as ub8 vectors, and mapping between IPs and domain names already sounds like something that a DNS library would do
8:48:55
phoe
if a program accepts domain names, then I guess that it should call into a DNS library, which can then in turn accept actual domain names and bare IP addresses alike and do the necessary munging before passing the resultant IP addresses into the IP layer
9:42:31
pjb
phoe: granted. It depends on the layer of this data structure. I mentionned domain name, because at the user level (eg. configuration file) we will often accept domain names as well as IP addresses. But you may want to retain the domain name internally. The question is when you want the resolution to occur.
9:57:47
flip214
there are S3 client libraries for CL... has someone written or started a minimal S3 server that uses the filesystem as backend?
10:11:35
engblom
I wish to run an external command and as the command is generating lines after lines I want to use them, rather than waiting for the program to terminate before using the output. Could someone help me with this?
11:03:44
engblom
I have been also playing a bit with uiop:run-program. When called with :output :string it will return all the output, except for when the process is killed. Is it possible to get it to return everything (output + error messages) in a single string regardless of how the process ended?
11:05:49
engblom
And then when I run in a terminal "pkill ping" I do not get anything returned, instead I end up in the debugger
11:08:09
flip214
pjb: no, there are quite a few S3 servers - even open-source. but nothing that "just" uses an existing local filesystem.
11:08:58
phoe
engblom: (handler-bind ((uiop:subprocess-error (lambda (c) (invoke-restart (find-restart 'continue c))))) (uiop:run-program "ping 1.1.1.1" :force-shell t :output :string))
11:11:51
phoe
no-defun-allowed: it would, but I'm nitpickish in the code above and want to only select continue restarts that are visible for the condition
11:11:58
jackdaniel
(defmacro foolhardy (() &body body) `(handler-bind ((serious-condition #'continue)) ,@body))
11:14:43
flip214
oh, "On Error Resume Next" https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/on-error-statement
11:16:41
no-defun-allowed
I assume someone made a joke like (deftype silly-condition () '(and condition (not serious-condition)))
11:17:05
engblom
I am trying to understand what the conscencus is from the question I answered. How would you write the full line in this example?
11:22:20
scymtym
btw, one has to be careful with CONTINUE in SBCL since the restart for trying again to call an undefined function is called CONTINUE instead of RETRY for historic(?) reasons
11:24:48
sabra
jackdaniel: I have a question on ecl and octets (different behavior from ccl and sbcl)
11:31:26
no-defun-allowed
All of the padding of the new vector isn't initialized to anything. And COUNTING X INTO Y is a funny way of saying FROM Y FROM 0
11:32:05
jackdaniel
(sbcl and ccl take their time to initialize them when they know how to initialize a specific type)
11:33:53
no-defun-allowed
It can also be written much nicer with REPLACE: https://plaster.tymoon.eu/view/2406
11:34:55
no-defun-allowed
What should PAD-OCTET-ARRAY do if the input vector is longer than the given length? And it would not work on any array, only vectors.
11:39:41
no-defun-allowed
Sure, I had expected to write a longer else-form. But REPLACE returns its first argument, so it could even be written without a LET. One moment...
11:42:56
flip214
no-defun-allowed: now it _sometimes_ returns the original data, and sometimes a newly allocated copy... that might make a difference if the vector is mutated later on.
11:43:30
no-defun-allowed
Still I don't like to nest e.g. LET in IF. I don't know why, it just does not look nice to me.
11:44:02
flip214
and (- length (length vector)) could only be calculated once, and used with PLUSP or so in the IF
11:45:25
flip214
jackdaniel: (IF (MINUSP padding-entries) (COPY-SEQ input) (REPLACE ... :START1 padding-entries))
11:45:39
mfiano
What makes it jarring to me is the arguments are split up oddly. I would move the :start1 keyword arguments to a new line.
11:46:17
flip214
or perhaps better (PLUSP ...) so if (ZEROP padding-entries) the original (or a copy) is returned
11:46:43
no-defun-allowed
Okay, you all keep working on this slightly-better-than-before code I wrote, and I'll head to bed.
11:47:55
sabra
Shinmera: Just restarted that project. I need to look at the reporting objects and figure out how to output successful test results and failures to files.
11:48:50
Shinmera
if it's useful outside of the comparison project I could be convinced to add the functionality directly into it.
11:54:26
sabra
Someone wants to blame someone 6 months later. You can pull a file proving the data and test results worked at time A. So any failure now is from subsequent development.
11:55:59
Shinmera
Ah, I see. Hmm. Makes me wonder whether having metadata in git would be useful for that.
11:58:23
Shinmera
I suppose one could make a file report with all the detail that parachute captures being output to file.
12:00:06
sabra
I expect that to be relatively straight forward. I just want the success and failures to be separate files.
12:00:43
sabra
Of course, I just thought I could make an array and forgot to initialize it in public ;)
12:07:00
engblom
Is there any tool for tidying up lisp source code that does a bit more than just indention? With a bit more I mean splitting long lines and such.
12:08:04
Shinmera
engblom: Not to my knowledge. The syntax rules for forms are complicated and often even need user input, for indentation alone.
12:14:47
Nilby
Since I've been trying using the pretty-printer to indent code in an editor, without a level of tweaking that I haven't yet achived, as you may know, it's sometimes better than nothing, but usually not.
12:18:15
jackdaniel
once when I've used the pretty printer it complained about a syntax error, so I've called it a petty printer
12:19:33
sabra
I think there are now 29 testing frameworks in quicklisp, not counting 2am or various helper libraries.
12:21:21
jackdaniel
ACTION has a local wrapper around 5am written in clim- the directory has a proud name 7am ;) but I'm not going to spoil you by publishing it!
12:25:23
flip214
jackdaniel: so there'll be a few 7am libraries, all with incompatible extensions...
12:31:26
flip214
jackdaniel: well, how are you gonna stop me from doing my own 7am? (1+ (1+ 5am)), a.k.a. 5am++
12:31:59
pjb
engblom: (let ((*print-right-margin* 72)) (loop for sexp = (read source nil source) until (eq sexp source) do (pprint sexp))) ;-) but you lose comments, and some () will be printed as NIL.
12:35:46
pjb
sabra: perhaps you want (<= size length) instead of (= size length) ; depends on whether you want an error on (> (length vector) size) or not.
12:39:39
pjb
sabra: errors such as Array index -8 out of bounds for #(0 … 0) . may be cryptic. Better provide a condition with an error message such: vector too long for pad-octet-vector.
13:16:46
pyc
I am going to form a large string by appending to an existing string iteratively inside a loop. Is this a good approach from performance perspective? In other languages, I normally append to a StringBuffer or a list and then convert it to a string in the end. Do we need to do something similar in CL too?
13:17:33
flip214
pyc: you can use (with-output-to-string () ...) and allocate a big(-enough) string beforehand.
13:17:38
pjb
pyc: not really. You can use with-output-to-string that'd be the equivalent of a StringBuffer.
13:18:19
pjb
pyc: an alterlative, is to manage it yourself: collect your string in a list, then compute the total length, and copy them in a newly allocated string of the right size.
13:18:46
pyc
Shinmera, flip214, pjb: Thanks! Is with-output-to-string definitely a better approach than concatenating iteratively to a string or it does not matter whether I concatenate or use with-output-to-string?
13:21:58
pjb
pyc: note that it is dependent on the implementation too. You may want to benchmark and see what works better for your (application cl-implementation) pair.
13:23:39
pjb
pyc: notably, asymptotic behavior doesn't say anything about the constants, and that's just expectation we have on implementations. Sometimes we may have surprises… (for example, on an unrelated note, reader macros are put in a sequential list in ccl, so when you have a lot of them (say on each unicode character) it becomes very slow to read stuff).
13:24:33
pjb
pyc: have a look at: https://github.com/informatimago/lisp/blob/master/common-lisp/cesarum/string.lisp#L159
13:36:44
pjb
(dolist (x '(1 2 3 4 5 6)) (block continue (if (oddp x) (return-from continue)) (prin1 x))) #| 246 --> nil |#
13:36:53
Colleen
Bike: drmeister said 1 hour, 9 minutes ago: I'm getting a cascade of errors when generating backtrace...
13:36:53
Colleen
Bike: drmeister said 59 minutes, 50 seconds ago: Are you making an assumption about what the output from backtrace_symbols looks like?
13:37:15
heisig
pyc: The body of dolist is like a tagbody, so you can simply introduce labels and go to them.
13:37:45
pjb
(dolist (x '(1 2 3 4 5 6)) (if (oddp x) (go continue)) (prin1 x) continue) #| 246 --> nil |#
14:46:34
engblom
I made a tool for tidying lisp files based upon (pprint (read)). I run it on itself and here is the result: https://pastebin.com/16QCHEw0