diff options
3 files changed, 1692 insertions, 2 deletions
diff --git a/2025/captions/emacsconf-2025-commonlisp--common-lisp-images-communicating-likeahuman-through-shared-emacs-slime-and-eev--screwlisp--main.vtt b/2025/captions/emacsconf-2025-commonlisp--common-lisp-images-communicating-likeahuman-through-shared-emacs-slime-and-eev--screwlisp--main.vtt new file mode 100644 index 00000000..2ad2f285 --- /dev/null +++ b/2025/captions/emacsconf-2025-commonlisp--common-lisp-images-communicating-likeahuman-through-shared-emacs-slime-and-eev--screwlisp--main.vtt @@ -0,0 +1,1260 @@ +WEBVTT captioned by jay_bird + +NOTE Introduction + +00:00:00.000 --> 00:00:07.119 +Hey, everyone. This talk is on this tradition, + +00:00:07.120 --> 00:00:10.639 +intelligent agents in Emacs + +00:00:10.640 --> 00:00:13.799 +using my Leonardo software individuals, + +00:00:13.800 --> 00:00:16.919 +which I've mistyped as I just wrote here, I see. + +00:00:16.920 --> 00:00:20.159 +Thank you to Sacha and everyone + +00:00:20.160 --> 00:00:25.239 +at EmacsConf and Emacs, I guess. + +00:00:25.240 --> 00:00:26.599 +Sorry that I was running late. + +00:00:26.600 --> 00:00:29.759 +I'm screwlisp.small-web.org. + +00:00:29.760 --> 00:00:33.999 +I run those one or two weekly shows for a long time, + +00:00:34.000 --> 00:00:35.599 +the Lispy Gopher Climate. + +00:00:35.600 --> 00:00:42.199 +I'm active on the Mastodon at @screwlisp@gamerplus.org. + +00:00:42.200 --> 00:00:46.719 +I'm screwtape on lambda.moo.mud.org. + +00:00:46.720 --> 00:00:50.474 +And I ported, over the last kind of year, + +00:00:50.475 --> 00:00:58.499 +years, to some extent, I ported Eric Sandewall's system + +00:00:58.500 --> 00:01:01.519 +for developing intelligent software agents, + +00:01:01.520 --> 00:01:04.879 +which he finished working on in 2014. + +00:01:04.880 --> 00:01:10.119 +I got it working again around 2025. + +00:01:10.120 --> 00:01:14.199 +First, we're going to take a long arc. + +00:01:14.200 --> 00:01:16.759 +We're going to motivate... This is the idea. + +00:01:16.760 --> 00:01:18.119 +You can see I'm using Org Mode, + +00:01:18.120 --> 00:01:19.959 +which I hope provides a good example + +00:01:19.960 --> 00:01:25.359 +for all the Org-Mode-oriented talks this conference. + +00:01:25.360 --> 00:01:26.399 +But you can also see + +00:01:26.400 --> 00:01:33.107 +that I'm using Eduardo Ochs's eev minor mode with Org. + +00:01:33.108 --> 00:01:35.640 +But we can see a little bit of the difference + +00:01:35.641 --> 00:01:39.207 +between these two, and that will kind of evolve into + +00:01:39.208 --> 00:01:45.259 +my style with the agent communication in Emacs. + +00:01:45.260 --> 00:01:52.999 +So you can see I used eev anchors as my Emacs headings. + +00:01:53.000 --> 00:01:56.839 +In eev, you just evaluate Elisp expressions + +00:01:56.840 --> 00:01:58.679 +as links to places. + +00:01:58.680 --> 00:02:01.679 +An anchor will link you somewhere else in the document. + +00:02:01.680 --> 00:02:04.807 +So my table of contents links to my talk, I guess. + +00:02:04.808 --> 00:02:07.507 +Anchors come in two halves, + +00:02:07.508 --> 00:02:12.940 +so that's why I built that unique table of contents + +00:02:12.941 --> 00:02:21.479 +experience there. What else am I going to say? + +NOTE Totally normal computing + +00:02:21.480 --> 00:02:24.174 +So first, let's just do some totally normal computing + +00:02:24.175 --> 00:02:27.140 +because intelligence is going to be difficult to describe. + +00:02:27.141 --> 00:02:31.100 +Let's just try and compute normally in Emacs in Org Mode + +00:02:31.101 --> 00:02:34.359 +and then segue more so into eev, + +00:02:34.360 --> 00:02:38.359 +and then maybe I would like if an agent was intelligent, + +00:02:38.360 --> 00:02:40.839 +I would think that an intelligent agent + +00:02:40.840 --> 00:02:43.319 +would do something like what I'm doing. + +00:02:43.320 --> 00:02:47.239 +It should be recognizably similar to what I do myself. + +00:02:47.240 --> 00:02:52.399 +I don't think the word intelligence is relevant + +00:02:52.400 --> 00:02:55.679 +if it's not related to something I'm not familiar with. + +NOTE Using Emacs as a human + +00:02:55.680 --> 00:03:00.999 +Using Emacs as a human, reading headings from my article, + +00:03:01.000 --> 00:03:03.919 +using Common Lisp. Right, my friend jeremy_list + +00:03:03.920 --> 00:03:06.879 +wrote actually a big project, + +00:03:06.880 --> 00:03:09.799 +but part of it was base64 encoding, + +00:03:09.800 --> 00:03:17.439 +and I just yoinked his C code for base64 encoding, I think. + +00:03:17.440 --> 00:03:20.759 +This is just clearly some C-based 64 encoding. + +00:03:20.760 --> 00:03:24.279 +If you go to my blog, his project is actually a C++ project + +00:03:24.280 --> 00:03:29.579 +and you can see me doing this with C++ rather than C. + +00:03:29.580 --> 00:03:33.319 +But basically, you can go to my blog articles + +00:03:33.320 --> 00:03:40.299 +if you want more detail to read something instead. + +00:03:40.300 --> 00:03:42.433 +And then here's some embeddable Common Lisp, + +00:03:42.434 --> 00:03:48.439 +Jack Daniel's ECL ANSI Common Lisp compiler I guess. + +00:03:48.440 --> 00:03:49.639 +This is just what it looks like. + +00:03:49.640 --> 00:03:52.239 +You can see I'm using Org Mode trickily, + +00:03:52.240 --> 00:03:56.119 +using noweb to put the lines of the C source block + +00:03:56.120 --> 00:04:00.279 +in this one. We're tangling it to this file + +00:04:00.280 --> 00:04:01.919 +rather than evaluating it. + +00:04:01.920 --> 00:04:05.279 +So, you know, literate programming, tangle and weave. + +00:04:05.280 --> 00:04:06.999 +We're just using Org Mode + +00:04:07.000 --> 00:04:09.197 +like the other Org Mode people + +00:04:09.198 --> 00:04:12.079 +are all showing us this conference, I guess. + +00:04:12.080 --> 00:04:13.399 +Then we have to compile it. + +00:04:13.400 --> 00:04:16.039 +It's always hard to remember these invocations for me. + +00:04:16.040 --> 00:04:20.159 +Results file. The file is my .fas file, + +00:04:20.160 --> 00:04:24.559 +because the way ECL's C and C++ integration works + +00:04:24.560 --> 00:04:30.519 +is that it just has to be seen by compile-file in Lisp. + +00:04:30.520 --> 00:04:32.119 +I cached this earlier. + +00:04:32.120 --> 00:04:36.199 +Oh, I should actually start Lisp, actually, shouldn't I? + +00:04:36.200 --> 00:04:39.639 +How are we going to do this? + +00:04:39.640 --> 00:04:47.099 +(setq inferior-lisp-program "ecl"). We could M-x slime. + +00:04:47.100 --> 00:04:48.919 +Because... we better actually load this. + +00:04:48.920 --> 00:04:54.119 +I did a dry run before. + +00:04:54.120 --> 00:04:58.259 +I think we can just load this, because I already did it. + +00:04:58.260 --> 00:05:04.079 +But I cached it. Let's nuke the cache. + +00:05:04.080 --> 00:05:06.599 +Okay, I'm going to say that that probably worked. + +00:05:06.600 --> 00:05:09.319 +Now, as you saw, that base64 encoding + +00:05:09.320 --> 00:05:13.619 +was just, I guess, number to character code + +00:05:13.620 --> 00:05:19.140 +to other character code. So I wrote this higher-level Lisp one, + +00:05:19.141 --> 00:05:20.599 +but that's not really the point. + +00:05:20.600 --> 00:05:26.199 +Obviously, Emacs also has Base64 encoding. + +00:05:26.200 --> 00:05:27.979 +It's just a point that we might have + +00:05:27.980 --> 00:05:29.959 +C++ and C external programs + +00:05:29.960 --> 00:05:31.239 +that we'd like to be integrating + +00:05:31.240 --> 00:05:37.139 +into our Emacs agents capabilities. + +00:05:37.140 --> 00:05:46.474 +Here we can see a normal named Org Mode source block. + +00:05:46.475 --> 00:05:50.474 +that calls that function, then an Org Mode source block + +00:05:50.475 --> 00:05:56.299 +that calls Emacs's base64-decode-string as a way of + +00:05:56.300 --> 00:05:57.940 +validating it, I guess. + +00:05:57.941 --> 00:06:00.140 +We go to Org, so we can see... + +00:06:00.141 --> 00:06:04.407 +I have a named call to that function calling the Lisp function + +00:06:04.408 --> 00:06:07.040 +Org is just kind of like this. + +00:06:07.041 --> 00:06:11.559 +It's cached but I don't seem to have run it before. + +00:06:11.560 --> 00:06:13.574 +Then I do the Emacs decode. + +00:06:13.575 --> 00:06:15.974 +So if we just run this using C-c C-c, + +00:06:15.975 --> 00:06:17.240 +and we can kind of see + +00:06:17.241 --> 00:06:22.179 +what Org Mode is like a little bit here. + +00:06:22.180 --> 00:06:24.319 +All right, yes, so as we can see, + +00:06:24.320 --> 00:06:27.659 +oh hang on, let's run this as well actually. + +00:06:27.660 --> 00:06:32.193 +So the C embeddable Common Lisp + +00:06:32.194 --> 00:06:35.199 +base64 encoding gets us this. + +00:06:35.200 --> 00:06:38.079 +And then Emacs is decoding and gets us back, + +00:06:38.080 --> 00:06:40.319 +kind of validates it. I think I'm missing some things. + +00:06:40.320 --> 00:06:43.079 +I don't pad characters out to the correct byte lengths, + +00:06:43.080 --> 00:06:45.399 +that kind of thing, but it's fine. + +NOTE using this via eev as a human + +00:06:45.400 --> 00:06:48.719 +And then I kind of contrast that to, + +00:06:48.720 --> 00:06:53.179 +I really like what my friend mdhughes.tech, + +00:06:53.180 --> 00:06:57.319 +game dev of the ages, calls REPL-driven development, + +00:06:57.320 --> 00:07:06.139 +which he says is kind of the opposite of literate coding. + +00:07:06.140 --> 00:07:08.940 +I think eev, at least for me, + +00:07:08.941 --> 00:07:11.079 +is kind of like REPL-driven development. + +00:07:11.080 --> 00:07:16.159 +So in eev, if you just press F8, the thing happens. + +00:07:16.160 --> 00:07:17.479 +And if it's a red star line, + +00:07:17.480 --> 00:07:19.439 +the thing is an Emacs Lisp thing, + +00:07:19.440 --> 00:07:22.999 +and otherwise it goes to the eepitch target. + +00:07:23.000 --> 00:07:26.719 +So if I do this, great, now I'm pitching to that slime + +00:07:26.720 --> 00:07:32.759 +REPL ECL I made. And then I pressed F8. Press F8 again. + +00:07:32.760 --> 00:07:34.480 +The string got coerced to a list. + +00:07:34.481 --> 00:07:38.359 +F8. Now it's car codified. + +00:07:38.360 --> 00:07:41.319 +I quite like this, because this looks like something I can do + +00:07:41.320 --> 00:07:44.239 +and understand doing and reason about doing. + +00:07:44.240 --> 00:07:49.519 +Then I form a command to send from Lisp to Emacs. + +00:07:49.520 --> 00:07:52.599 +Then I do it and I recover the string from the beginning. + +00:07:52.600 --> 00:07:56.119 +I guess I had one of these here. Oh, by the way, look at + +00:07:56.120 --> 00:07:59.159 +What Org Mode did with an eev source block. + +00:07:59.160 --> 00:08:00.999 +And then when I close the source block + +00:08:01.000 --> 00:08:02.679 +using C-c ', + +00:08:02.680 --> 00:08:05.319 +it brings me back to the Org doc, + +00:08:05.320 --> 00:08:09.159 +which was a cool synergy between the eev minor mode + +00:08:09.160 --> 00:08:16.019 +and eev source blocks in Org Mode that I noticed. + +00:08:16.020 --> 00:08:22.599 +And so I kind of want my agents to be like this eev usage. + +00:08:22.600 --> 00:08:25.159 +Clearly, Org is super powerful, + +00:08:25.160 --> 00:08:28.159 +but I don't even like writing calls like this, + +00:08:28.160 --> 00:08:32.079 +where you write the function that will happen last first, + +00:08:32.080 --> 00:08:39.039 +so you're kind of writing right to left, first to last. + +00:08:39.040 --> 00:08:41.239 +Whereas in REPL-driven development, + +00:08:41.240 --> 00:08:43.199 +I guess I'm writing top to bottom, + +00:08:43.200 --> 00:08:46.979 +and eev, I guess, executable logs + +00:08:46.980 --> 00:08:48.599 +are logs that are like that. + +00:08:48.600 --> 00:08:52.378 +So I kind of like eev's view for reasoning + +00:08:52.379 --> 00:08:54.399 +more than Org's Tangle. + +00:08:54.400 --> 00:08:57.319 +Obviously, Tangle is trying to do tricky things, + +00:08:57.320 --> 00:09:01.359 +but maybe they have different specializations, + +00:09:01.360 --> 00:09:04.879 +and eev's one is more close + +00:09:04.880 --> 00:09:07.799 +to my own version of intelligence, maybe. + +NOTE Software individuals using eev in Emacs like a human + +00:09:07.800 --> 00:09:13.539 +Software individuals using eev in Emacs like a human. + +00:09:13.540 --> 00:09:17.279 +Yeah, you can always visit my blog post for more detail. + +00:09:17.280 --> 00:09:20.039 +Right, I made a CLOS object + +00:09:20.040 --> 00:09:22.519 +in Common Lisp to wrap doing this. + +00:09:22.520 --> 00:09:23.639 +It's not really the topic. + +00:09:23.640 --> 00:09:27.959 +It's in the appendix somewhere if you need it. + +00:09:27.960 --> 00:09:29.559 +So I've just executed that. + +00:09:29.560 --> 00:09:32.079 +You can look at the appendix in your own time. + +NOTE Sandewall's leonardo system + +00:09:32.080 --> 00:09:33.959 +Jumping over to actually starting + +00:09:33.960 --> 00:09:36.319 +our hypothetical intelligent agent. + +00:09:36.320 --> 00:09:38.239 +I guess we're doing eev here. + +00:09:38.240 --> 00:09:46.759 +So if we open this, press F8 a bunch of times. + +00:09:46.760 --> 00:09:49.199 +Oh, and if you were cloning it yourself, + +00:09:49.200 --> 00:09:56.719 +I guess that's what you would do. setq eepitch-buffer-name. + +00:09:56.720 --> 00:10:00.319 +Oh yeah, if you went to an eepitch shell and then came back. + +00:10:00.320 --> 00:10:01.679 +You would have had to do that, but I didn't. + +00:10:01.680 --> 00:10:04.239 +I didn't, so I didn't need to. + +00:10:04.240 --> 00:10:07.279 +Sandewall's style is to use relative paths + +00:10:07.280 --> 00:10:11.974 +to tell which agent is acting inside a software individual. + +00:10:11.975 --> 00:10:13.359 +Remembering a software individual + +00:10:13.360 --> 00:10:15.239 +is potentially a bunch of agents. + +00:10:15.240 --> 00:10:18.479 +And we load... So one individual, + +00:10:18.480 --> 00:10:21.919 +all the agents in each individual share a kernel. + +00:10:21.920 --> 00:10:25.599 +So only one agent in one software individual + +00:10:25.600 --> 00:10:28.279 +is active at any given time, but the agents are separate. + +00:10:28.280 --> 00:10:31.279 +They just all have to share the kernel resource, + +00:10:31.280 --> 00:10:38.319 +which is the Remus agent. Oh, I got rid of this. + +00:10:38.320 --> 00:10:43.279 +And start the CLE is the thing. + +00:10:43.280 --> 00:10:46.119 +Oh, I did need to have an EmacsConf knowledge base. + +00:10:46.120 --> 00:10:48.959 +Well, let's just keep eepitching for a little bit. + +00:10:48.960 --> 00:10:55.259 +So I think I made... I'm going to call it emacsconf-kb. + +00:10:55.260 --> 00:10:59.679 +Right, that looks likely. And I think that the agent... + +00:10:59.680 --> 00:11:03.479 +I can check this. I could have checked that. + +00:11:03.480 --> 00:11:12.699 +I could have done something like (get emacsconf-kb contents). + +00:11:12.700 --> 00:11:13.479 +Yeah, and you can see + +00:11:13.480 --> 00:11:15.879 +there's a location inside it which is agent1, + +00:11:15.880 --> 00:11:17.519 +which I assume is an entity file + +00:11:17.520 --> 00:11:20.599 +that I was working with before. + +00:11:20.600 --> 00:11:21.919 +And then what were we going to do? + +00:11:21.920 --> 00:11:28.279 +Oh yeah, back to the embeddable Common Lisp image. + +00:11:28.280 --> 00:11:36.099 +So if I just press our button back to there... + +NOTE Start a loop for one leonardo software individual + +00:11:36.100 --> 00:11:41.119 +And so my idea is that for an Emacs agent, + +00:11:41.120 --> 00:11:46.999 +basically, I'd like to have an Emacs Lisp list. + +00:11:47.000 --> 00:11:49.640 +And just when stuff gets into that list, + +00:11:49.641 --> 00:11:53.239 +the agent which is always running, but running slowly, + +00:11:53.240 --> 00:11:58.359 +will incrementally just do the stuff it finds in that list. + +00:11:58.360 --> 00:12:00.759 +Populating that list probably gets into stuff + +00:12:00.760 --> 00:12:03.199 +like your Beliefs, Desires, Intents framework + +00:12:03.200 --> 00:12:06.159 +and those kind of well-known and well-studied algorithms. + +00:12:06.160 --> 00:12:07.799 +That's not the point here. + +00:12:07.800 --> 00:12:14.259 +I just want to have a list in Emacs that my ECL... + +00:12:14.260 --> 00:12:16.079 +I'm just going to run a loop in ECL, + +00:12:16.080 --> 00:12:18.319 +and the ECL is going to keep sending + +00:12:18.320 --> 00:12:22.399 +anything it finds in that Emacs Lisp list + +00:12:22.400 --> 00:12:25.399 +to the software agent. The agent is also in Emacs, + +00:12:25.400 --> 00:12:28.759 +so it would be able to populate its own list itself + +00:12:28.760 --> 00:12:36.159 +if it had an idea of evaluating desires and chances to improve + +00:12:36.160 --> 00:12:37.559 +whatever it wants to improve + +00:12:37.560 --> 00:12:39.999 +and chances to avoid whatever it wants to avoid. + +00:12:40.000 --> 00:12:47.599 +We talked a little bit too much. Let's just start this. + +00:12:47.600 --> 00:12:51.539 +Sorry that I'm manually setting up my screen. + +00:12:51.540 --> 00:12:55.499 +Then let's put CLisp over here. + +00:12:55.500 --> 00:12:58.679 +Right, we could work with this, right? + +00:12:58.680 --> 00:13:00.099 +This loop isn't very important. + +00:13:00.100 --> 00:13:04.919 +It's just a Common Lisp loop. I copy my friend jmbr's style + +00:13:04.920 --> 00:13:08.199 +of using Lisp machine-style keyword arguments + +00:13:08.200 --> 00:13:12.119 +instead of symbols like cl-loop, + +00:13:12.120 --> 00:13:16.719 +the compatibility thing in Emacs Lisp does. + +00:13:16.720 --> 00:13:28.139 +I'd never initialized that. Well, let's do that. + +00:13:28.140 --> 00:13:30.679 +Okay, now we have the list. + +00:13:30.680 --> 00:13:35.019 +And just every 30, let's turn it down to every 20 seconds. + +00:13:35.020 --> 00:13:37.159 +Hypothetically, it's going to put + +00:13:37.160 --> 00:13:39.999 +whatever it finds in there, into there. + +00:13:40.000 --> 00:13:46.239 +And so, I think, yeah, and now... Great. + +00:13:46.240 --> 00:13:50.099 +So here I'm just going to fill it with stuff. + +00:13:50.100 --> 00:13:54.839 +And this is quite interesting, I think. + +00:13:54.840 --> 00:13:58.479 +It just shows I can put a whole bunch of stuff into that list. + +00:13:58.480 --> 00:14:01.199 +Ideally, the agent would populate it itself + +00:14:01.200 --> 00:14:03.359 +with a BDI algorithm or something. + +00:14:03.360 --> 00:14:04.919 +But if we just put some stuff in there, + +00:14:04.920 --> 00:14:07.799 +we'll see that it will all get sent + +00:14:07.800 --> 00:14:14.799 +basically using Eduardo's eepitch internal machinery, at least. + +00:14:14.800 --> 00:14:17.479 +And hence, it meets my requirement + +00:14:17.480 --> 00:14:20.779 +that it works exactly like I work. + +00:14:20.780 --> 00:14:25.859 +And then in eev, I just have to press M-e. + +00:14:25.860 --> 00:14:31.479 +Oh, it works via Emacs server, and I didn't start that, + +00:14:31.480 --> 00:14:39.719 +so if we server-start, hopefully... + +00:14:39.720 --> 00:14:42.799 +And then, ideally, things will just begin happening + +00:14:42.800 --> 00:14:53.119 +in this slime-repl C/Lisp agent. + +00:14:53.120 --> 00:15:05.419 +Oh, if this was still running. + +00:15:05.420 --> 00:15:07.199 +Okay, well we got at least one, + +00:15:07.200 --> 00:15:09.639 +but hypothetically lots of these will happen. + +00:15:09.640 --> 00:15:13.699 +So, show agent, I guess, + +00:15:13.700 --> 00:15:17.039 +happened over here. I put a whole bunch of "sleep-for"s in, + +00:15:17.040 --> 00:15:19.719 +because I thought that going slowly + +00:15:19.720 --> 00:15:21.319 +would make it seem more human. + +00:15:21.320 --> 00:15:24.639 +Like I saw in Eduardo's talk last year + +00:15:24.640 --> 00:15:29.099 +which is where I learned about eev. + +00:15:29.100 --> 00:15:32.319 +The system is a little fragile. + +00:15:32.320 --> 00:15:41.079 +Hypothetically, we have a whole bunch of agents. + +00:15:41.080 --> 00:15:43.039 +I guess every time it gets sent, + +00:15:43.040 --> 00:15:44.999 +it checks that we're in the right agent. + +00:15:45.000 --> 00:15:46.999 +And it's not actually just sending a string, + +00:15:47.000 --> 00:15:52.799 +it's sending a sequence of string actions over there. + +00:15:52.800 --> 00:15:57.479 +And so we see Emacs Lisp hypothetically put, + +00:15:57.480 --> 00:16:06.859 +I guess it put this "foo bar baz!" into an entity, message-1, + +00:16:06.860 --> 00:16:11.899 +which should be of type message, I guess, conceivably. + +00:16:11.900 --> 00:16:13.319 +I forget if I set that up earlier. + +00:16:13.320 --> 00:16:14.719 +It's in the appendix somewhere. + +00:16:14.720 --> 00:16:17.999 +And then it just called, it did a sequence of actions + +00:16:18.000 --> 00:16:21.319 +which was really just one action of showing that. + +00:16:21.320 --> 00:16:26.399 +And then I called b64-encode on message1, + +00:16:26.400 --> 00:16:30.599 +which I believe will have set message-1 encoded. + +00:16:30.600 --> 00:16:37.242 +Can I check that manually while it's happening? + +00:16:37.243 --> 00:16:51.499 +Disaster. Well that's what it should have been. + +00:16:51.500 --> 00:16:54.940 +Well, I did mention it was a little bit fragile. + +00:16:54.941 --> 00:17:03.279 +What if we put... Can we kind of rescue this? + +00:17:03.280 --> 00:17:07.239 +I don't want to try redoing this. It's slightly fragile. + +00:17:07.240 --> 00:17:12.639 +What it would do, we can see the actions are kind of getting there, + +00:17:12.640 --> 00:17:16.719 +but somehow my message didn't end up getting encoded + +00:17:16.720 --> 00:17:18.119 +by that sequence of actions. + +00:17:18.120 --> 00:17:23.279 +So this decode will have also made the decoded one be null. + +NOTE Let's do it manually + +00:17:23.280 --> 00:17:26.239 +Let's just do it manually. Should have worked. + +00:17:26.240 --> 00:17:30.559 +b64-encode, which calls out to Emacs + +00:17:30.560 --> 00:17:37.299 +to get everything actually done. + +00:17:37.300 --> 00:17:41.519 +Oh, I got interrupted by the agent. + +00:17:41.520 --> 00:17:43.320 +Well, if I do it manually, it worked. + +00:17:43.321 --> 00:17:53.519 +Hypothetically, the queue thing should have worked. Great. + +00:17:53.520 --> 00:17:56.840 +Well, you can see it's kind of working. + +00:17:56.841 --> 00:17:57.440 +Could be more robust. + +00:17:57.441 --> 00:18:03.640 +The reason is that I think what I did is a bit fragile, + +00:18:03.641 --> 00:18:07.107 +but the intent is that FIPA, + +00:18:07.108 --> 00:18:09.307 +Foundation for Intelligent Physical Agents's + +00:18:09.308 --> 00:18:15.639 +SL standard has tools for reliability + +00:18:15.640 --> 00:18:19.919 +through repetition and checking outcomes and that kind of thing. + +00:18:19.920 --> 00:18:22.959 +So I would use those. I'm not putting too much work + +00:18:22.960 --> 00:18:26.679 +into being ultra-reliable right now, but it kind of worked. + +00:18:26.680 --> 00:18:29.759 +We saw, I guess, at least Embeddable Common Lisp + +00:18:29.760 --> 00:18:35.599 +believed it used emacsclient externally, asynchronously, + +00:18:35.600 --> 00:18:38.359 +to send these to Emacs within Emacs. + +00:18:38.360 --> 00:18:41.599 +I put a whole bunch of sleeps into its thing + +00:18:41.600 --> 00:18:44.999 +to make it look slow and human-like, kind of happened + +00:18:45.000 --> 00:18:52.719 +because Emacs' model is that it's kind of single-threaded. + +00:18:52.720 --> 00:18:59.639 +Can I just... I bet if we run this again + +00:18:59.640 --> 00:19:02.119 +It'll at least look like it's succeeding + +00:19:02.120 --> 00:19:05.039 +because I fixed the base64 encoding + +00:19:05.040 --> 00:19:11.399 +and so forth in the background. I wonder if it will. + +NOTE Wrapping up + +00:19:11.400 --> 00:19:15.559 +In the meantime, let's wrap up this talk to some extent. + +00:19:15.560 --> 00:19:18.799 +Then I'm just kind of saying what I'm expecting to happen. + +00:19:18.800 --> 00:19:20.479 +I took out next action. + +00:19:20.480 --> 00:19:25.279 +Originally, I was keeping the list inside of the agent. + +00:19:25.280 --> 00:19:27.879 +Then I decided to keep the list inside Emacs + +00:19:27.880 --> 00:19:31.679 +because I have kind of first class Emacs is my IDE, + +00:19:31.680 --> 00:19:37.607 +so I have better access to what's going on in my IDE. + +NOTE Intelligence + +00:19:37.608 --> 00:19:39.559 +Then I wanted to talk about intelligence a little bit + +00:19:39.560 --> 00:19:41.199 +in whatever my remaining time is. + +00:19:41.200 --> 00:19:43.039 +I just have these great bullet points + +00:19:43.040 --> 00:19:45.559 +of nosrednA yduJ and Eric Sandewall. + +00:19:45.560 --> 00:19:50.039 +So nosrednA yduJ, when she was on the show quite a long time ago, + +00:19:50.040 --> 00:19:55.559 +she... I keep describing things as expert systems + +00:19:55.560 --> 00:19:57.039 +and she wanted to know what I meant + +00:19:57.040 --> 00:19:58.359 +when I said expert systems, + +00:19:58.360 --> 00:20:00.199 +and I gave her a Lisp software example + +00:20:00.200 --> 00:20:02.618 +and she said she personally wrote + +00:20:02.619 --> 00:20:06.279 +that software in the 80s that I was referring to + +00:20:06.280 --> 00:20:08.239 +and she wanted to know how it was an expert system. + +00:20:08.240 --> 00:20:10.039 +What I mean when I say expert system + +00:20:10.040 --> 00:20:19.839 +is a system that works kind of like I do and eev's eepitch does. + +00:20:19.840 --> 00:20:21.999 +It's where we can really reason + +00:20:22.000 --> 00:20:24.199 +in a very human-relatable way + +00:20:24.200 --> 00:20:26.479 +about what the inputs to the program is. + +00:20:26.480 --> 00:20:31.399 +And also a program should be exposed to other programs + +00:20:31.400 --> 00:20:36.559 +in terms of like a well-structured transfer of knowledge as inputs, + +00:20:36.560 --> 00:20:38.010 +and it should have a well-structured + +00:20:38.011 --> 00:20:41.939 +transfer of knowledge kind of outputs. + +00:20:41.940 --> 00:20:47.159 +I don't know why this b64-encode message wasn't working. + +00:20:47.160 --> 00:20:49.999 +Then we kind of faked it into working. + +00:20:50.000 --> 00:20:52.399 +It's going to be embarrassing for me + +00:20:52.400 --> 00:20:58.739 +if anybody watches this. But yeah, so yduJ's thing... + +00:20:58.740 --> 00:20:59.959 +And then I was going to also build + +00:20:59.960 --> 00:21:02.679 +that into Eric Sandewall's one. + +00:21:02.680 --> 00:21:05.639 +So this is my vision of expert systems + +00:21:05.640 --> 00:21:07.779 +as kind of maybe this is an important + +00:21:07.780 --> 00:21:11.679 +general style loosely associated with Lisp. + +00:21:11.680 --> 00:21:14.399 +Same as the Lisp editor Emacs. + +00:21:14.400 --> 00:21:17.665 +So Eric Sandewall's description of intelligence + +00:21:17.666 --> 00:21:21.159 +was that his grandchildren were intelligent. + +00:21:21.160 --> 00:21:26.439 +So if we had software agents that were intelligent, + +00:21:26.440 --> 00:21:32.439 +this would be true if and maybe only if they were similar + +00:21:32.440 --> 00:21:33.719 +to his grandchildren + +00:21:33.720 --> 00:21:36.319 +who were a good reference for intelligence. + +00:21:36.320 --> 00:21:39.199 +And grandchildren live for a really long time. + +00:21:39.200 --> 00:21:42.879 +They kind of learn gradually. + +00:21:42.880 --> 00:21:46.879 +They don't run on GPUs for a few minutes + +00:21:46.880 --> 00:21:51.879 +and then get thrown out forever, something like that. + +00:21:51.880 --> 00:21:54.959 +And so this is the kind of vision of, I guess, + +00:21:54.960 --> 00:21:57.919 +the Leonardo system software individual stuff. + +00:21:57.920 --> 00:22:03.946 +You can see we kind of faked it into... + +00:22:03.947 --> 00:22:06.320 +at least the show get message one decoded bits were working. + +00:22:06.321 --> 00:22:07.300 +I'm not sure what was happening + +00:22:07.301 --> 00:22:12.674 +with the Elisp ones that worked interactively, + +00:22:12.675 --> 00:22:18.607 +but then they didn't work in my loopy thing. + +00:22:18.608 --> 00:22:21.307 +Oh yeah, and then so I mentioned + +00:22:21.308 --> 00:22:24.640 +thank you to Sacha at the start of this talk. + +00:22:24.641 --> 00:22:26.974 +And so Eric Sandewall's emphasis + +00:22:26.975 --> 00:22:31.340 +that you'd really like intelligent software agents, + +00:22:31.341 --> 00:22:34.174 +Leonardo system agents, to be like your grandchildren. + +00:22:34.175 --> 00:22:40.659 +And I was talking to somebody, maybe to Ramin Honary + +00:22:40.660 --> 00:22:44.959 +who's doing the schemacs talk this year + +00:22:44.960 --> 00:22:46.874 +about Sacha's writing. + +00:22:46.875 --> 00:22:48.840 +A lot of Sacha's writing is about + +00:22:48.841 --> 00:22:51.774 +her experiences of life and technology, + +00:22:51.775 --> 00:22:54.374 +and especially raising A* + +00:22:54.375 --> 00:22:59.740 +and her observations of her progeny A*'s + +00:22:59.741 --> 00:23:05.319 +experiences of life and technology, + +00:23:05.320 --> 00:23:07.874 +I would say as well as being + +00:23:07.875 --> 00:23:18.039 +the Emacs News and Emacs conf doer that she is. + +00:23:18.040 --> 00:23:22.740 +Yeah, and so I think a lot of what Sacha is seen doing + +00:23:22.741 --> 00:23:25.840 +and concerned with are specifically what Eric Sandewall + +00:23:25.841 --> 00:23:31.207 +identifies as the study of intelligence as such, + +00:23:31.208 --> 00:23:36.479 +as should apply to computing as well. That was my thought + +00:23:36.480 --> 00:23:42.979 +on Sacha, Eric Sandewall, intelligence, and yduJ. + +00:23:42.980 --> 00:23:44.240 +I have this note from pizzapal... + +00:23:44.241 --> 00:23:46.274 +I didn't realize that Microsoft had announced + +00:23:46.275 --> 00:23:49.679 +that 2025 was going to be the year of the software agent. + +00:23:49.680 --> 00:23:51.199 +I only found this out in hindsight + +00:23:51.200 --> 00:23:54.199 +when I saw people crowing on the Mastodon + +00:23:54.200 --> 00:23:58.079 +about how Microsoft had basically declared + +00:23:58.080 --> 00:24:00.779 +that their Year of the Agent marketing campaign + +00:24:00.780 --> 00:24:04.459 +was a failure + +00:24:04.460 --> 00:24:09.279 +where basically people didn't like the same old web services + +00:24:09.280 --> 00:24:11.359 +but now while you're accessing, + +00:24:11.360 --> 00:24:15.239 +while you're formally kind of accessing a web service, + +00:24:15.240 --> 00:24:16.959 +the kind of web service that used to be called + +00:24:16.960 --> 00:24:19.279 +serverless web services, this kind of thing, + +00:24:19.280 --> 00:24:23.879 +but you're just being gibbered at by Microsoft Copilot + +00:24:23.880 --> 00:24:27.119 +while you're trying to use regular services. + +00:24:27.120 --> 00:24:29.279 +And people turned out not to like this. + +00:24:29.280 --> 00:24:32.399 +I think that, as we can see in this agent, + +00:24:32.400 --> 00:24:36.374 +the agent really needs to be running on its own clock + +00:24:36.375 --> 00:24:37.907 +and independently of you. + +00:24:37.908 --> 00:24:42.279 +Like if you imagine your body is getting + +00:24:42.280 --> 00:24:46.074 +novel, slightly speculative instructions from your brain + +00:24:46.075 --> 00:24:50.680 +constantly throughout your entire waking day, quite slowly, + +00:24:50.681 --> 00:24:54.974 +this is what an agent should be like. + +00:24:54.975 --> 00:24:59.540 +And it should be... Sandewall wrote about this. + +00:24:59.541 --> 00:25:01.540 +Basically, computer programs + +00:25:01.541 --> 00:25:04.840 +aren't going to want to use human natural language with each other. + +00:25:04.841 --> 00:25:06.674 +There's nothing desirable about that, + +00:25:06.675 --> 00:25:10.674 +so you wouldn't have two hypothetical Microsoft agents, + +00:25:10.675 --> 00:25:13.399 +which are just regular web services with + +00:25:13.400 --> 00:25:16.340 +a GPT model gibbering at you + +00:25:16.341 --> 00:25:19.839 +while you're trying to use the web service. + +00:25:19.840 --> 00:25:22.539 +I think we can see... + +00:25:22.540 --> 00:25:26.740 +Microsoft did the wrong thing with the word agent, + +00:25:26.741 --> 00:25:30.707 +allowing that agent is an overloaded term like static. + +00:25:30.708 --> 00:25:34.256 +I'm going to stop this. I'm not going to try and fix this. + +00:25:34.257 --> 00:25:36.313 +Sorry, everybody. Thank you. Talk to you on the Mastodon. + +00:25:36.314 --> 00:25:37.919 +Hopefully, see you on the show. + +00:25:37.920 --> 00:25:40.399 +See you at your conference talks. + +00:25:40.400 --> 00:25:45.599 +My blog has writing and examples of this with multi-agents, + +00:25:45.600 --> 00:25:50.819 +more C and C++ stuff, Lisp things. + +00:25:50.820 --> 00:25:53.439 +You're welcome to come on my show to be interviewed, + +00:25:53.440 --> 00:25:56.640 +however formally we do that. See everybody next time. diff --git a/2025/info/commonlisp-after.md b/2025/info/commonlisp-after.md index ac9eae20..01819fdc 100644 --- a/2025/info/commonlisp-after.md +++ b/2025/info/commonlisp-after.md @@ -1,6 +1,436 @@ <!-- Automatically generated by emacsconf-publish-after-page --> +<div class="transcript transcript-mainVideo"><a name="commonlisp-mainVideo-transcript"></a><h1>Transcript</h1> + + +<div class="transcript-heading">[[!template new="1" text="""Introduction""" start="00:00:00.000" video="mainVideo-commonlisp" id="subtitle"]]</div>[[!template text="""Hey, everyone. This talk is on this tradition,""" start="00:00:00.000" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""intelligent agents in Emacs""" start="00:00:07.120" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""using my Leonardo software individuals,""" start="00:00:10.640" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""which I've mistyped as I just wrote here, I see.""" start="00:00:13.800" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Thank you to Sacha and everyone""" start="00:00:16.920" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""at EmacsConf and Emacs, I guess.""" start="00:00:20.160" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Sorry that I was running late.""" start="00:00:25.240" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""I'm screwlisp.small-web.org.""" start="00:00:26.600" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""I run those one or two weekly shows for a long time,""" start="00:00:29.760" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""the Lispy Gopher Climate.""" start="00:00:34.000" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""I'm active on the Mastodon at @screwlisp@gamerplus.org.""" start="00:00:35.600" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""I'm screwtape on lambda.moo.mud.org.""" start="00:00:42.200" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""And I ported, over the last kind of year,""" start="00:00:46.720" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""years, to some extent, I ported Eric Sandewall's system""" start="00:00:50.475" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""for developing intelligent software agents,""" start="00:00:58.500" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""which he finished working on in 2014.""" start="00:01:01.520" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""I got it working again around 2025.""" start="00:01:04.880" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""First, we're going to take a long arc.""" start="00:01:10.120" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""We're going to motivate... This is the idea.""" start="00:01:14.200" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""You can see I'm using Org Mode,""" start="00:01:16.760" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""which I hope provides a good example""" start="00:01:18.120" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""for all the Org-Mode-oriented talks this conference.""" start="00:01:19.960" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""But you can also see""" start="00:01:25.360" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""that I'm using Eduardo Ochs's eev minor mode with Org.""" start="00:01:26.400" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""But we can see a little bit of the difference""" start="00:01:33.108" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""between these two, and that will kind of evolve into""" start="00:01:35.641" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""my style with the agent communication in Emacs.""" start="00:01:39.208" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""So you can see I used eev anchors as my Emacs headings.""" start="00:01:45.260" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""In eev, you just evaluate Elisp expressions""" start="00:01:53.000" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""as links to places.""" start="00:01:56.840" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""An anchor will link you somewhere else in the document.""" start="00:01:58.680" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""So my table of contents links to my talk, I guess.""" start="00:02:01.680" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Anchors come in two halves,""" start="00:02:04.808" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""so that's why I built that unique table of contents""" start="00:02:07.508" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""experience there. What else am I going to say?""" start="00:02:12.941" video="mainVideo-commonlisp" id="subtitle"]] + +<div class="transcript-heading">[[!template new="1" text="""Totally normal computing""" start="00:02:21.480" video="mainVideo-commonlisp" id="subtitle"]]</div>[[!template text="""So first, let's just do some totally normal computing""" start="00:02:21.480" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""because intelligence is going to be difficult to describe.""" start="00:02:24.175" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Let's just try and compute normally in Emacs in Org Mode""" start="00:02:27.141" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""and then segue more so into eev,""" start="00:02:31.101" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""and then maybe I would like if an agent was intelligent,""" start="00:02:34.360" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""I would think that an intelligent agent""" start="00:02:38.360" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""would do something like what I'm doing.""" start="00:02:40.840" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""It should be recognizably similar to what I do myself.""" start="00:02:43.320" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""I don't think the word intelligence is relevant""" start="00:02:47.240" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""if it's not related to something I'm not familiar with.""" start="00:02:52.400" video="mainVideo-commonlisp" id="subtitle"]] + +<div class="transcript-heading">[[!template new="1" text="""Using Emacs as a human""" start="00:02:55.680" video="mainVideo-commonlisp" id="subtitle"]]</div>[[!template text="""Using Emacs as a human, reading headings from my article,""" start="00:02:55.680" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""using Common Lisp. Right, my friend jeremy_list""" start="00:03:01.000" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""wrote actually a big project,""" start="00:03:03.920" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""but part of it was base64 encoding,""" start="00:03:06.880" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""and I just yoinked his C code for base64 encoding, I think.""" start="00:03:09.800" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""This is just clearly some C-based 64 encoding.""" start="00:03:17.440" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""If you go to my blog, his project is actually a C++ project""" start="00:03:20.760" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""and you can see me doing this with C++ rather than C.""" start="00:03:24.280" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""But basically, you can go to my blog articles""" start="00:03:29.580" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""if you want more detail to read something instead.""" start="00:03:33.320" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""And then here's some embeddable Common Lisp,""" start="00:03:40.300" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Jack Daniel's ECL ANSI Common Lisp compiler I guess.""" start="00:03:42.434" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""This is just what it looks like.""" start="00:03:48.440" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""You can see I'm using Org Mode trickily,""" start="00:03:49.640" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""using noweb to put the lines of the C source block""" start="00:03:52.240" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""in this one. We're tangling it to this file""" start="00:03:56.120" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""rather than evaluating it.""" start="00:04:00.280" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""So, you know, literate programming, tangle and weave.""" start="00:04:01.920" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""We're just using Org Mode""" start="00:04:05.280" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""like the other Org Mode people""" start="00:04:07.000" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""are all showing us this conference, I guess.""" start="00:04:09.198" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Then we have to compile it.""" start="00:04:12.080" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""It's always hard to remember these invocations for me.""" start="00:04:13.400" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Results file. The file is my .fas file,""" start="00:04:16.040" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""because the way ECL's C and C++ integration works""" start="00:04:20.160" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""is that it just has to be seen by compile-file in Lisp.""" start="00:04:24.560" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""I cached this earlier.""" start="00:04:30.520" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Oh, I should actually start Lisp, actually, shouldn't I?""" start="00:04:32.120" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""How are we going to do this?""" start="00:04:36.200" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""(setq inferior-lisp-program "ecl"). We could M-x slime.""" start="00:04:39.640" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Because... we better actually load this.""" start="00:04:47.100" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""I did a dry run before.""" start="00:04:48.920" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""I think we can just load this, because I already did it.""" start="00:04:54.120" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""But I cached it. Let's nuke the cache.""" start="00:04:58.260" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Okay, I'm going to say that that probably worked.""" start="00:05:04.080" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Now, as you saw, that base64 encoding""" start="00:05:06.600" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""was just, I guess, number to character code""" start="00:05:09.320" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""to other character code. So I wrote this higher-level Lisp one,""" start="00:05:13.620" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""but that's not really the point.""" start="00:05:19.141" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Obviously, Emacs also has Base64 encoding.""" start="00:05:20.600" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""It's just a point that we might have""" start="00:05:26.200" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""C++ and C external programs""" start="00:05:27.980" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""that we'd like to be integrating""" start="00:05:29.960" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""into our Emacs agents capabilities.""" start="00:05:31.240" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Here we can see a normal named Org Mode source block.""" start="00:05:37.140" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""that calls that function, then an Org Mode source block""" start="00:05:46.475" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""that calls Emacs's base64-decode-string as a way of""" start="00:05:50.475" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""validating it, I guess.""" start="00:05:56.300" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""We go to Org, so we can see...""" start="00:05:57.941" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""I have a named call to that function calling the Lisp function""" start="00:06:00.141" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Org is just kind of like this.""" start="00:06:04.408" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""It's cached but I don't seem to have run it before.""" start="00:06:07.041" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Then I do the Emacs decode.""" start="00:06:11.560" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""So if we just run this using C-c C-c,""" start="00:06:13.575" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""and we can kind of see""" start="00:06:15.975" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""what Org Mode is like a little bit here.""" start="00:06:17.241" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""All right, yes, so as we can see,""" start="00:06:22.180" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""oh hang on, let's run this as well actually.""" start="00:06:24.320" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""So the C embeddable Common Lisp""" start="00:06:27.660" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""base64 encoding gets us this.""" start="00:06:32.194" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""And then Emacs is decoding and gets us back,""" start="00:06:35.200" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""kind of validates it. I think I'm missing some things.""" start="00:06:38.080" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""I don't pad characters out to the correct byte lengths,""" start="00:06:40.320" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""that kind of thing, but it's fine.""" start="00:06:43.080" video="mainVideo-commonlisp" id="subtitle"]] + +<div class="transcript-heading">[[!template new="1" text="""using this via eev as a human""" start="00:06:45.400" video="mainVideo-commonlisp" id="subtitle"]]</div>[[!template text="""And then I kind of contrast that to,""" start="00:06:45.400" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""I really like what my friend mdhughes.tech,""" start="00:06:48.720" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""game dev of the ages, calls REPL-driven development,""" start="00:06:53.180" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""which he says is kind of the opposite of literate coding.""" start="00:06:57.320" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""I think eev, at least for me,""" start="00:07:06.140" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""is kind of like REPL-driven development.""" start="00:07:08.941" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""So in eev, if you just press F8, the thing happens.""" start="00:07:11.080" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""And if it's a red star line,""" start="00:07:16.160" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""the thing is an Emacs Lisp thing,""" start="00:07:17.480" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""and otherwise it goes to the eepitch target.""" start="00:07:19.440" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""So if I do this, great, now I'm pitching to that slime""" start="00:07:23.000" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""REPL ECL I made. And then I pressed F8. Press F8 again.""" start="00:07:26.720" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""The string got coerced to a list.""" start="00:07:32.760" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""F8. Now it's car codified.""" start="00:07:34.481" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""I quite like this, because this looks like something I can do""" start="00:07:38.360" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""and understand doing and reason about doing.""" start="00:07:41.320" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Then I form a command to send from Lisp to Emacs.""" start="00:07:44.240" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Then I do it and I recover the string from the beginning.""" start="00:07:49.520" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""I guess I had one of these here. Oh, by the way, look at""" start="00:07:52.600" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""What Org Mode did with an eev source block.""" start="00:07:56.120" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""And then when I close the source block""" start="00:07:59.160" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""using C-c ',""" start="00:08:01.000" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""it brings me back to the Org doc,""" start="00:08:02.680" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""which was a cool synergy between the eev minor mode""" start="00:08:05.320" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""and eev source blocks in Org Mode that I noticed.""" start="00:08:09.160" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""And so I kind of want my agents to be like this eev usage.""" start="00:08:16.020" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Clearly, Org is super powerful,""" start="00:08:22.600" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""but I don't even like writing calls like this,""" start="00:08:25.160" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""where you write the function that will happen last first,""" start="00:08:28.160" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""so you're kind of writing right to left, first to last.""" start="00:08:32.080" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Whereas in REPL-driven development,""" start="00:08:39.040" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""I guess I'm writing top to bottom,""" start="00:08:41.240" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""and eev, I guess, executable logs""" start="00:08:43.200" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""are logs that are like that.""" start="00:08:46.980" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""So I kind of like eev's view for reasoning""" start="00:08:48.600" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""more than Org's Tangle.""" start="00:08:52.379" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Obviously, Tangle is trying to do tricky things,""" start="00:08:54.400" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""but maybe they have different specializations,""" start="00:08:57.320" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""and eev's one is more close""" start="00:09:01.360" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""to my own version of intelligence, maybe.""" start="00:09:04.880" video="mainVideo-commonlisp" id="subtitle"]] + +<div class="transcript-heading">[[!template new="1" text="""Software individuals using eev in Emacs like a human""" start="00:09:07.800" video="mainVideo-commonlisp" id="subtitle"]]</div>[[!template text="""Software individuals using eev in Emacs like a human.""" start="00:09:07.800" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Yeah, you can always visit my blog post for more detail.""" start="00:09:13.540" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Right, I made a CLOS object""" start="00:09:17.280" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""in Common Lisp to wrap doing this.""" start="00:09:20.040" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""It's not really the topic.""" start="00:09:22.520" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""It's in the appendix somewhere if you need it.""" start="00:09:23.640" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""So I've just executed that.""" start="00:09:27.960" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""You can look at the appendix in your own time.""" start="00:09:29.560" video="mainVideo-commonlisp" id="subtitle"]] + +<div class="transcript-heading">[[!template new="1" text="""Sandewall's leonardo system""" start="00:09:32.080" video="mainVideo-commonlisp" id="subtitle"]]</div>[[!template text="""Jumping over to actually starting""" start="00:09:32.080" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""our hypothetical intelligent agent.""" start="00:09:33.960" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""I guess we're doing eev here.""" start="00:09:36.320" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""So if we open this, press F8 a bunch of times.""" start="00:09:38.240" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Oh, and if you were cloning it yourself,""" start="00:09:46.760" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""I guess that's what you would do. setq eepitch-buffer-name.""" start="00:09:49.200" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Oh yeah, if you went to an eepitch shell and then came back.""" start="00:09:56.720" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""You would have had to do that, but I didn't.""" start="00:10:00.320" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""I didn't, so I didn't need to.""" start="00:10:01.680" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Sandewall's style is to use relative paths""" start="00:10:04.240" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""to tell which agent is acting inside a software individual.""" start="00:10:07.280" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Remembering a software individual""" start="00:10:11.975" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""is potentially a bunch of agents.""" start="00:10:13.360" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""And we load... So one individual,""" start="00:10:15.240" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""all the agents in each individual share a kernel.""" start="00:10:18.480" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""So only one agent in one software individual""" start="00:10:21.920" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""is active at any given time, but the agents are separate.""" start="00:10:25.600" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""They just all have to share the kernel resource,""" start="00:10:28.280" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""which is the Remus agent. Oh, I got rid of this.""" start="00:10:31.280" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""And start the CLE is the thing.""" start="00:10:38.320" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Oh, I did need to have an EmacsConf knowledge base.""" start="00:10:43.280" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Well, let's just keep eepitching for a little bit.""" start="00:10:46.120" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""So I think I made... I'm going to call it emacsconf-kb.""" start="00:10:48.960" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Right, that looks likely. And I think that the agent...""" start="00:10:55.260" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""I can check this. I could have checked that.""" start="00:10:59.680" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""I could have done something like (get emacsconf-kb contents).""" start="00:11:03.480" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Yeah, and you can see""" start="00:11:12.700" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""there's a location inside it which is agent1,""" start="00:11:13.480" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""which I assume is an entity file""" start="00:11:15.880" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""that I was working with before.""" start="00:11:17.520" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""And then what were we going to do?""" start="00:11:20.600" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Oh yeah, back to the embeddable Common Lisp image.""" start="00:11:21.920" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""So if I just press our button back to there...""" start="00:11:28.280" video="mainVideo-commonlisp" id="subtitle"]] + +<div class="transcript-heading">[[!template new="1" text="""Start a loop for one leonardo software individual""" start="00:11:36.100" video="mainVideo-commonlisp" id="subtitle"]]</div>[[!template text="""And so my idea is that for an Emacs agent,""" start="00:11:36.100" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""basically, I'd like to have an Emacs Lisp list.""" start="00:11:41.120" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""And just when stuff gets into that list,""" start="00:11:47.000" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""the agent which is always running, but running slowly,""" start="00:11:49.641" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""will incrementally just do the stuff it finds in that list.""" start="00:11:53.240" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Populating that list probably gets into stuff""" start="00:11:58.360" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""like your Beliefs, Desires, Intents framework""" start="00:12:00.760" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""and those kind of well-known and well-studied algorithms.""" start="00:12:03.200" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""That's not the point here.""" start="00:12:06.160" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""I just want to have a list in Emacs that my ECL...""" start="00:12:07.800" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""I'm just going to run a loop in ECL,""" start="00:12:14.260" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""and the ECL is going to keep sending""" start="00:12:16.080" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""anything it finds in that Emacs Lisp list""" start="00:12:18.320" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""to the software agent. The agent is also in Emacs,""" start="00:12:22.400" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""so it would be able to populate its own list itself""" start="00:12:25.400" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""if it had an idea of evaluating desires and chances to improve""" start="00:12:28.760" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""whatever it wants to improve""" start="00:12:36.160" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""and chances to avoid whatever it wants to avoid.""" start="00:12:37.560" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""We talked a little bit too much. Let's just start this.""" start="00:12:40.000" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Sorry that I'm manually setting up my screen.""" start="00:12:47.600" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Then let's put CLisp over here.""" start="00:12:51.540" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Right, we could work with this, right?""" start="00:12:55.500" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""This loop isn't very important.""" start="00:12:58.680" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""It's just a Common Lisp loop. I copy my friend jmbr's style""" start="00:13:00.100" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""of using Lisp machine-style keyword arguments""" start="00:13:04.920" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""instead of symbols like cl-loop,""" start="00:13:08.200" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""the compatibility thing in Emacs Lisp does.""" start="00:13:12.120" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""I'd never initialized that. Well, let's do that.""" start="00:13:16.720" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Okay, now we have the list.""" start="00:13:28.140" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""And just every 30, let's turn it down to every 20 seconds.""" start="00:13:30.680" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Hypothetically, it's going to put""" start="00:13:35.020" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""whatever it finds in there, into there.""" start="00:13:37.160" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""And so, I think, yeah, and now... Great.""" start="00:13:40.000" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""So here I'm just going to fill it with stuff.""" start="00:13:46.240" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""And this is quite interesting, I think.""" start="00:13:50.100" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""It just shows I can put a whole bunch of stuff into that list.""" start="00:13:54.840" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Ideally, the agent would populate it itself""" start="00:13:58.480" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""with a BDI algorithm or something.""" start="00:14:01.200" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""But if we just put some stuff in there,""" start="00:14:03.360" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""we'll see that it will all get sent""" start="00:14:04.920" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""basically using Eduardo's eepitch internal machinery, at least.""" start="00:14:07.800" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""And hence, it meets my requirement""" start="00:14:14.800" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""that it works exactly like I work.""" start="00:14:17.480" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""And then in eev, I just have to press M-e.""" start="00:14:20.780" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Oh, it works via Emacs server, and I didn't start that,""" start="00:14:25.860" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""so if we server-start, hopefully...""" start="00:14:31.480" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""And then, ideally, things will just begin happening""" start="00:14:39.720" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""in this slime-repl C/Lisp agent.""" start="00:14:42.800" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Oh, if this was still running.""" start="00:14:53.120" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Okay, well we got at least one,""" start="00:15:05.420" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""but hypothetically lots of these will happen.""" start="00:15:07.200" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""So, show agent, I guess,""" start="00:15:09.640" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""happened over here. I put a whole bunch of "sleep-for"s in,""" start="00:15:13.700" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""because I thought that going slowly""" start="00:15:17.040" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""would make it seem more human.""" start="00:15:19.720" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Like I saw in Eduardo's talk last year""" start="00:15:21.320" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""which is where I learned about eev.""" start="00:15:24.640" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""The system is a little fragile.""" start="00:15:29.100" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Hypothetically, we have a whole bunch of agents.""" start="00:15:32.320" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""I guess every time it gets sent,""" start="00:15:41.080" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""it checks that we're in the right agent.""" start="00:15:43.040" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""And it's not actually just sending a string,""" start="00:15:45.000" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""it's sending a sequence of string actions over there.""" start="00:15:47.000" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""And so we see Emacs Lisp hypothetically put,""" start="00:15:52.800" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""I guess it put this "foo bar baz!" into an entity, message-1,""" start="00:15:57.480" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""which should be of type message, I guess, conceivably.""" start="00:16:06.860" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""I forget if I set that up earlier.""" start="00:16:11.900" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""It's in the appendix somewhere.""" start="00:16:13.320" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""And then it just called, it did a sequence of actions""" start="00:16:14.720" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""which was really just one action of showing that.""" start="00:16:18.000" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""And then I called b64-encode on message1,""" start="00:16:21.320" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""which I believe will have set message-1 encoded.""" start="00:16:26.400" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Can I check that manually while it's happening?""" start="00:16:30.600" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Disaster. Well that's what it should have been.""" start="00:16:37.243" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Well, I did mention it was a little bit fragile.""" start="00:16:51.500" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""What if we put... Can we kind of rescue this?""" start="00:16:54.941" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""I don't want to try redoing this. It's slightly fragile.""" start="00:17:03.280" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""What it would do, we can see the actions are kind of getting there,""" start="00:17:07.240" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""but somehow my message didn't end up getting encoded""" start="00:17:12.640" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""by that sequence of actions.""" start="00:17:16.720" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""So this decode will have also made the decoded one be null.""" start="00:17:18.120" video="mainVideo-commonlisp" id="subtitle"]] + +<div class="transcript-heading">[[!template new="1" text="""Let's do it manually""" start="00:17:23.280" video="mainVideo-commonlisp" id="subtitle"]]</div>[[!template text="""Let's just do it manually. Should have worked.""" start="00:17:23.280" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""b64-encode, which calls out to Emacs""" start="00:17:26.240" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""to get everything actually done.""" start="00:17:30.560" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Oh, I got interrupted by the agent.""" start="00:17:37.300" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Well, if I do it manually, it worked.""" start="00:17:41.520" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Hypothetically, the queue thing should have worked. Great.""" start="00:17:43.321" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Well, you can see it's kind of working.""" start="00:17:53.520" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Could be more robust.""" start="00:17:56.841" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""The reason is that I think what I did is a bit fragile,""" start="00:17:57.441" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""but the intent is that FIPA,""" start="00:18:03.641" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Foundation for Intelligent Physical Agents's""" start="00:18:07.108" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""SL standard has tools for reliability""" start="00:18:09.308" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""through repetition and checking outcomes and that kind of thing.""" start="00:18:15.640" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""So I would use those. I'm not putting too much work""" start="00:18:19.920" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""into being ultra-reliable right now, but it kind of worked.""" start="00:18:22.960" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""We saw, I guess, at least Embeddable Common Lisp""" start="00:18:26.680" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""believed it used emacsclient externally, asynchronously,""" start="00:18:29.760" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""to send these to Emacs within Emacs.""" start="00:18:35.600" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""I put a whole bunch of sleeps into its thing""" start="00:18:38.360" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""to make it look slow and human-like, kind of happened""" start="00:18:41.600" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""because Emacs' model is that it's kind of single-threaded.""" start="00:18:45.000" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Can I just... I bet if we run this again""" start="00:18:52.720" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""It'll at least look like it's succeeding""" start="00:18:59.640" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""because I fixed the base64 encoding""" start="00:19:02.120" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""and so forth in the background. I wonder if it will.""" start="00:19:05.040" video="mainVideo-commonlisp" id="subtitle"]] + +<div class="transcript-heading">[[!template new="1" text="""Wrapping up""" start="00:19:11.400" video="mainVideo-commonlisp" id="subtitle"]]</div>[[!template text="""In the meantime, let's wrap up this talk to some extent.""" start="00:19:11.400" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Then I'm just kind of saying what I'm expecting to happen.""" start="00:19:15.560" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""I took out next action.""" start="00:19:18.800" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Originally, I was keeping the list inside of the agent.""" start="00:19:20.480" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Then I decided to keep the list inside Emacs""" start="00:19:25.280" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""because I have kind of first class Emacs is my IDE,""" start="00:19:27.880" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""so I have better access to what's going on in my IDE.""" start="00:19:31.680" video="mainVideo-commonlisp" id="subtitle"]] + +<div class="transcript-heading">[[!template new="1" text="""Intelligence""" start="00:19:37.608" video="mainVideo-commonlisp" id="subtitle"]]</div>[[!template text="""Then I wanted to talk about intelligence a little bit""" start="00:19:37.608" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""in whatever my remaining time is.""" start="00:19:39.560" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""I just have these great bullet points""" start="00:19:41.200" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""of nosrednA yduJ and Eric Sandewall.""" start="00:19:43.040" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""So nosrednA yduJ, when she was on the show quite a long time ago,""" start="00:19:45.560" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""she... I keep describing things as expert systems""" start="00:19:50.040" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""and she wanted to know what I meant""" start="00:19:55.560" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""when I said expert systems,""" start="00:19:57.040" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""and I gave her a Lisp software example""" start="00:19:58.360" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""and she said she personally wrote""" start="00:20:00.200" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""that software in the 80s that I was referring to""" start="00:20:02.619" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""and she wanted to know how it was an expert system.""" start="00:20:06.280" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""What I mean when I say expert system""" start="00:20:08.240" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""is a system that works kind of like I do and eev's eepitch does.""" start="00:20:10.040" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""It's where we can really reason""" start="00:20:19.840" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""in a very human-relatable way""" start="00:20:22.000" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""about what the inputs to the program is.""" start="00:20:24.200" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""And also a program should be exposed to other programs""" start="00:20:26.480" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""in terms of like a well-structured transfer of knowledge as inputs,""" start="00:20:31.400" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""and it should have a well-structured""" start="00:20:36.560" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""transfer of knowledge kind of outputs.""" start="00:20:38.011" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""I don't know why this b64-encode message wasn't working.""" start="00:20:41.940" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Then we kind of faked it into working.""" start="00:20:47.160" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""It's going to be embarrassing for me""" start="00:20:50.000" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""if anybody watches this. But yeah, so yduJ's thing...""" start="00:20:52.400" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""And then I was going to also build""" start="00:20:58.740" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""that into Eric Sandewall's one.""" start="00:20:59.960" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""So this is my vision of expert systems""" start="00:21:02.680" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""as kind of maybe this is an important""" start="00:21:05.640" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""general style loosely associated with Lisp.""" start="00:21:07.780" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Same as the Lisp editor Emacs.""" start="00:21:11.680" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""So Eric Sandewall's description of intelligence""" start="00:21:14.400" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""was that his grandchildren were intelligent.""" start="00:21:17.666" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""So if we had software agents that were intelligent,""" start="00:21:21.160" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""this would be true if and maybe only if they were similar""" start="00:21:26.440" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""to his grandchildren""" start="00:21:32.440" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""who were a good reference for intelligence.""" start="00:21:33.720" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""And grandchildren live for a really long time.""" start="00:21:36.320" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""They kind of learn gradually.""" start="00:21:39.200" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""They don't run on GPUs for a few minutes""" start="00:21:42.880" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""and then get thrown out forever, something like that.""" start="00:21:46.880" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""And so this is the kind of vision of, I guess,""" start="00:21:51.880" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""the Leonardo system software individual stuff.""" start="00:21:54.960" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""You can see we kind of faked it into...""" start="00:21:57.920" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""at least the show get message one decoded bits were working.""" start="00:22:03.947" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""I'm not sure what was happening""" start="00:22:06.321" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""with the Elisp ones that worked interactively,""" start="00:22:07.301" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""but then they didn't work in my loopy thing.""" start="00:22:12.675" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Oh yeah, and then so I mentioned""" start="00:22:18.608" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""thank you to Sacha at the start of this talk.""" start="00:22:21.308" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""And so Eric Sandewall's emphasis""" start="00:22:24.641" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""that you'd really like intelligent software agents,""" start="00:22:26.975" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Leonardo system agents, to be like your grandchildren.""" start="00:22:31.341" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""And I was talking to somebody, maybe to Ramin Honary""" start="00:22:34.175" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""who's doing the schemacs talk this year""" start="00:22:40.660" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""about Sacha's writing.""" start="00:22:44.960" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""A lot of Sacha's writing is about""" start="00:22:46.875" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""her experiences of life and technology,""" start="00:22:48.841" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""and especially raising A\*""" start="00:22:51.775" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""and her observations of her progeny A\*'s""" start="00:22:54.375" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""experiences of life and technology,""" start="00:22:59.741" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""I would say as well as being""" start="00:23:05.320" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""the Emacs News and Emacs conf doer that she is.""" start="00:23:07.875" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Yeah, and so I think a lot of what Sacha is seen doing""" start="00:23:18.040" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""and concerned with are specifically what Eric Sandewall""" start="00:23:22.741" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""identifies as the study of intelligence as such,""" start="00:23:25.841" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""as should apply to computing as well. That was my thought""" start="00:23:31.208" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""on Sacha, Eric Sandewall, intelligence, and yduJ.""" start="00:23:36.480" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""I have this note from pizzapal...""" start="00:23:42.980" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""I didn't realize that Microsoft had announced""" start="00:23:44.241" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""that 2025 was going to be the year of the software agent.""" start="00:23:46.275" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""I only found this out in hindsight""" start="00:23:49.680" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""when I saw people crowing on the Mastodon""" start="00:23:51.200" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""about how Microsoft had basically declared""" start="00:23:54.200" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""that their Year of the Agent marketing campaign""" start="00:23:58.080" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""was a failure""" start="00:24:00.780" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""where basically people didn't like the same old web services""" start="00:24:04.460" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""but now while you're accessing,""" start="00:24:09.280" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""while you're formally kind of accessing a web service,""" start="00:24:11.360" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""the kind of web service that used to be called""" start="00:24:15.240" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""serverless web services, this kind of thing,""" start="00:24:16.960" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""but you're just being gibbered at by Microsoft Copilot""" start="00:24:19.280" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""while you're trying to use regular services.""" start="00:24:23.880" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""And people turned out not to like this.""" start="00:24:27.120" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""I think that, as we can see in this agent,""" start="00:24:29.280" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""the agent really needs to be running on its own clock""" start="00:24:32.400" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""and independently of you.""" start="00:24:36.375" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Like if you imagine your body is getting""" start="00:24:37.908" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""novel, slightly speculative instructions from your brain""" start="00:24:42.280" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""constantly throughout your entire waking day, quite slowly,""" start="00:24:46.075" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""this is what an agent should be like.""" start="00:24:50.681" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""And it should be... Sandewall wrote about this.""" start="00:24:54.975" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Basically, computer programs""" start="00:24:59.541" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""aren't going to want to use human natural language with each other.""" start="00:25:01.541" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""There's nothing desirable about that,""" start="00:25:04.841" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""so you wouldn't have two hypothetical Microsoft agents,""" start="00:25:06.675" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""which are just regular web services with""" start="00:25:10.675" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""a GPT model gibbering at you""" start="00:25:13.400" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""while you're trying to use the web service.""" start="00:25:16.341" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""I think we can see...""" start="00:25:19.840" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Microsoft did the wrong thing with the word agent,""" start="00:25:22.540" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""allowing that agent is an overloaded term like static.""" start="00:25:26.741" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""I'm going to stop this. I'm not going to try and fix this.""" start="00:25:30.708" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Sorry, everybody. Thank you. Talk to you on the Mastodon.""" start="00:25:34.257" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""Hopefully, see you on the show.""" start="00:25:36.314" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""See you at your conference talks.""" start="00:25:37.920" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""My blog has writing and examples of this with multi-agents,""" start="00:25:40.400" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""more C and C++ stuff, Lisp things.""" start="00:25:45.600" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""You're welcome to come on my show to be interviewed,""" start="00:25:50.820" video="mainVideo-commonlisp" id="subtitle"]] +[[!template text="""however formally we do that. See everybody next time.""" start="00:25:53.440" video="mainVideo-commonlisp" id="subtitle"]] + +</div> + +Captioner: sachac + Questions or comments? Please e-mail [emacsconf-org-private@gnu.org](mailto:emacsconf-org-private@gnu.org?subject=Comment%20for%20EmacsConf%202023%20commonlisp%3A%20Common%20Lisp%20images%20communicating%20like-a-human%20through%20shared%20Emacs%20slime%20and%20eev) diff --git a/2025/info/commonlisp-before.md b/2025/info/commonlisp-before.md index 19927326..6b76c676 100644 --- a/2025/info/commonlisp-before.md +++ b/2025/info/commonlisp-before.md @@ -8,12 +8,12 @@ The following image shows where the talk is in the schedule for Sat 2025-12-06. Format: 26-min talk ; Q&A: IRC <https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev> Etherpad: <https://pad.emacsconf.org/2025-commonlisp> Etherpad: <https://pad.emacsconf.org/2025-commonlisp> Discuss on IRC: [#emacsconf-dev](https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev) -Status: Quality check +Status: Now playing on the conference livestream <div>Times in different time zones:</div><div class="times" start="2025-12-06T19:25:00Z" end="2025-12-06T19:55:00Z"><div class="conf-time">Saturday, Dec 6 2025, ~2:25 PM - 2:55 PM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Saturday, Dec 6 2025, ~1:25 PM - 1:55 PM CST (US/Central)<br />Saturday, Dec 6 2025, ~12:25 PM - 12:55 PM MST (US/Mountain)<br />Saturday, Dec 6 2025, ~11:25 AM - 11:55 AM PST (US/Pacific)<br />Saturday, Dec 6 2025, ~7:25 PM - 7:55 PM UTC <br />Saturday, Dec 6 2025, ~8:25 PM - 8:55 PM CET (Europe/Paris)<br />Saturday, Dec 6 2025, ~9:25 PM - 9:55 PM EET (Europe/Athens)<br />Sunday, Dec 7 2025, ~12:55 AM - 1:25 AM IST (Asia/Kolkata)<br />Sunday, Dec 7 2025, ~3:25 AM - 3:55 AM +08 (Asia/Singapore)<br />Sunday, Dec 7 2025, ~4:25 AM - 4:55 AM JST (Asia/Tokyo)</div></div><div><strong><a href="/2025/watch/dev/">Find out how to watch and participate</a></strong></div> - +<div class="vid mainVideo"><video controls preload="none" id="mainVideo-commonlisp"><source src="https://media.emacsconf.org/2025/emacsconf-2025-commonlisp--common-lisp-images-communicating-likeahuman-through-shared-emacs-slime-and-eev--screwlisp--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2025/captions/emacsconf-2025-commonlisp--common-lisp-images-communicating-likeahuman-through-shared-emacs-slime-and-eev--screwlisp--main.vtt" default />"""<p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video><div></div>Duration: 25:56 minutes<div class="files resources"><ul><li><a href="https://pad.emacsconf.org/2025-commonlisp">Open Etherpad</a></li><li><a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev">Open public Q&A</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-commonlisp--common-lisp-images-communicating-likeahuman-through-shared-emacs-slime-and-eev--screwlisp--debugged.png">Download --debugged.png</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-commonlisp--common-lisp-images-communicating-likeahuman-through-shared-emacs-slime-and-eev--screwlisp--intro.vtt">Download --intro.vtt</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-commonlisp--common-lisp-images-communicating-likeahuman-through-shared-emacs-slime-and-eev--screwlisp--intro.webm">Download --intro.webm</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-commonlisp--common-lisp-images-communicating-likeahuman-through-shared-emacs-slime-and-eev--screwlisp--main.opus">Download --main.opus (23MB)</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-commonlisp--common-lisp-images-communicating-likeahuman-through-shared-emacs-slime-and-eev--screwlisp--main.org">Download --main.org</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-commonlisp--common-lisp-images-communicating-likeahuman-through-shared-emacs-slime-and-eev--screwlisp--main.png">Download --main.png</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-commonlisp--common-lisp-images-communicating-likeahuman-through-shared-emacs-slime-and-eev--screwlisp--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-commonlisp--common-lisp-images-communicating-likeahuman-through-shared-emacs-slime-and-eev--screwlisp--main.webm">Download --main.webm (63MB)</a></li><li><a href="https://youtu.be/hy5i6Qb6fYE">View on Youtube</a></li></ul></div></div> # Description <!-- End of emacsconf-publish-before-page -->
\ No newline at end of file |
