2023-05-14 02:55:27 My IRC client is written in awk 2.0 but I've never bothered learning it properly 2023-05-14 08:29:20 Well, the point of builds> does> yesterday was so that I can use them to write up vocabularly words. 2023-05-14 08:29:49 Should be fairly straightforward - I remember how I went about it in the past. 2023-05-14 08:30:46 I think FIND is already compatible, but I haven't actually tested it in multi-vocabularly conditions. But it has code that will walk a list of them. 2023-05-14 08:30:59 It's just only walked a list of one to date. 2023-05-14 08:31:17 I Walk the Line (The Best Of The Johnny Cash TV Show) 2023-05-14 08:31:38 Heh. Theme music for Forth words. 2023-05-14 08:32:14 My wife's dad was a particularly big Johnny Cash fan. 2023-05-14 08:33:14 He was a mechanical engineer for Dow Chemical, but it a lot of ways never stopped being an Iowa farm boy. 2023-05-14 08:34:07 supposedly is good if you make your metacompiler able to bootstrap as much as possible 2023-05-14 08:34:15 a common thing in lisp and forth 2023-05-14 08:34:38 define some few primitives and the rest is defined in the language itself 2023-05-14 08:34:43 Cash was a Morse code operator while he was in the service and monitored Soviet radio traffic. He was like the first person to receive information about Stalin's death. 2023-05-14 08:34:52 it adds overhead, but also portability 2023-05-14 08:35:34 vms14: I'm not sure how much overhead it would HAVE to add. What makes you say that? 2023-05-14 08:35:51 it depends on your compiling method 2023-05-14 08:36:05 in forth colon words usually have very little cost 2023-05-14 08:36:12 My test of it is to have a system with a particular md5 hash that I can re-meta-compile and get a system with the same hash. 2023-05-14 08:36:23 I want it to be able to recreate a perfect image of itself. 2023-05-14 08:36:39 :0 2023-05-14 08:36:58 I keep playing with awk xD 2023-05-14 08:37:28 I always liked the unix philosophy and awk resonates with it 2023-05-14 08:37:56 I always wanted a language able to control other processes 2023-05-14 08:38:20 I know fairly little about awk. I've only used it lightly and when I do I just search online for a magic awk spell to do what I need. 2023-05-14 08:38:30 I don't really "know" it at all. 2023-05-14 08:38:36 it's a performance nightmare, but executing commands decouples you from almost everything 2023-05-14 08:38:42 I use sed more often. 2023-05-14 08:38:51 sed and grep cover most of what I need to do. 2023-05-14 08:38:57 the command can be written in any language and by any person 2023-05-14 08:39:12 you just need to use messages 2023-05-14 08:39:34 you can have daemons that start yourself and pipe them to send commands and have a response 2023-05-14 08:40:28 for example I can make a c program that reads from stdin and has a bunch of strcmp 2023-05-14 08:40:42 the results if any just need to be printed on stdout 2023-05-14 08:41:10 it can be a one time command or a daemon 2023-05-14 08:41:16 :-) Yes, that's how it works. 2023-05-14 08:41:28 KipIngram: it's powerful 2023-05-14 08:41:48 but the exec is expensive and some people might not like that 2023-05-14 08:42:06 It is - my whole test harness set up for this new test stand I got last fall is written primarily in bash and along these lines. 2023-05-14 08:42:25 Doesn't matter - it's managing tests that take hours or days to run. 2023-05-14 08:42:45 I discovered netbsd has its own test suited named atf 2023-05-14 08:42:57 So for that kind of task it's irrelevant how it performs. 2023-05-14 08:43:32 https://man.netbsd.org/NetBSD-9.0/atf.7 2023-05-14 08:43:39 I have 12 drives in this stand; each one has its own directory on the stand and I can run as many instances of the test engine as I want. 2023-05-14 08:44:10 I've cd /usr/tests/ and run some tests, but got bored after a million and stoped them 2023-05-14 08:44:11 And it's set up so that I actually run it from a different machine - a "controller," so to speak - I could have as many stands active as I liked. 2023-05-14 08:44:51 The directory names match the PCI address of each drive. 2023-05-14 08:44:54 I have to add a test suite on my lang 2023-05-14 08:45:14 usually is just to exec a program and look at the output 2023-05-14 08:45:17 Yeah, a test framework for something like that is good. 2023-05-14 08:45:27 I don't have one at the moment, but eventually want one. 2023-05-14 08:45:34 but in the same lang you just test function results 2023-05-14 08:46:24 KipIngram: what about an error system? 2023-05-14 08:46:37 you made something with signals I remember 2023-05-14 08:46:50 you turned a segfault into an error handler 2023-05-14 08:46:51 xD 2023-05-14 08:47:06 That's mostly how I've tested this drive test system - I just run it, several drives at a time, and see that it produces the expected results. 2023-05-14 08:47:40 Well, in Forth the traditional error response is just to restart the interpreter, usually with a clean stack. 2023-05-14 08:48:06 All I've added to that is the snapshotting, so that it restores a prior condition when you get back to the interpreter. 2023-05-14 08:48:14 And yes, it has limited signal support. 2023-05-14 08:48:25 ah right, you save the image every line 2023-05-14 08:48:26 Catches memory addressing errors and divide by zero type things. 2023-05-14 08:48:52 Yes, but that's really kind of an "add on" and isn't part of the "nitty gritty" of error recoevery. 2023-05-14 08:49:09 That signal stuff was hard to write, because it's all not documented very well. 2023-05-14 08:49:18 I really had to dig to find information on it. 2023-05-14 08:49:24 can you come back to more than one line? 2023-05-14 08:49:40 And it's got some very processor specific code in it. 2023-05-14 08:50:01 I don't understand - if you finished the previous line successfully then there's no reason to roll back further than that. 2023-05-14 08:50:08 No - it can't go back multiple lines. 2023-05-14 08:50:18 It overwrites the snapshot each time it finishes a line without error. 2023-05-14 08:50:35 does it save the image every line inside a colon definition that spans several lines? 2023-05-14 08:50:48 or it's turned off 2023-05-14 08:51:13 Forth interprets one "line" at a time, but what it regards as a "line" might be an entire block of code. 2023-05-14 08:51:25 so a colon definition is just a line 2023-05-14 08:51:28 Or many blocks of code. Let's say I say " LOAD." 2023-05-14 08:51:40 That block might load many other blocks, recursively. 2023-05-14 08:51:52 But the snapshot is made at the beginning of the line I TYPED. 2023-05-14 08:52:05 It doesn't matter how many blocks it loads - it doesn't update the snapshot while doing that. 2023-05-14 08:52:16 So if there is an error anywhere in the code I loaded, it undoes all of it. 2023-05-14 08:52:22 ah, as you use blocks to save colon definitions there and then load them, you can roll back to the previous line after a load block 2023-05-14 08:52:27 Otherwise I'd have to issue a different command when I re-tried. 2023-05-14 08:52:41 It's all about being in a position to re-issue exactly the same typed line. 2023-05-14 08:53:10 KipIngram: do you have the ability to set "checkpoints"? 2023-05-14 08:53:19 I want to be able to just hit the cursor-up key to scroll back to the line and fix it and hit enter again. 2023-05-14 08:53:36 No, I don't have any other snapshotting type feature. 2023-05-14 08:53:44 well, what's different from using forget and recovering from your snapshot? 2023-05-14 08:53:53 I assume also the call stack is restored 2023-05-14 08:54:07 I do think that with the new one I'll be able to write an image of a running system off to disk, though. 2023-05-14 08:54:31 It would just kind of "reverse the image load process." 2023-05-14 08:54:42 Turn the addresses back into offsets, etc. 2023-05-14 08:54:52 And create a new image in blocks that I could later load and run. 2023-05-14 08:55:21 The way I'm structuring this one will make it a lot easier to identify which items need to be address/offset converted. 2023-05-14 08:55:34 In my prior systems they get all mixed together and it's unclear how to do that. 2023-05-14 08:56:00 That is, the value of some cells depends on where in RAM the code is loaded. 2023-05-14 08:56:26 In the new system, those cells will be well-segregated from the others. 2023-05-14 08:56:33 Mostly will just be the table entries. 2023-05-14 08:57:11 Trying to save current stacks would be difficult, so I probably won't try. 2023-05-14 08:57:17 You've got all these numbers on the stack. 2023-05-14 08:57:22 Which ones are addresses? 2023-05-14 08:57:31 In a typeless Forth system there's no way to tell. 2023-05-14 08:58:00 So if I save an image off to disk and reload it later, it will load with empty stacks. 2023-05-14 08:58:39 Anyway, I guess that is close to what you would call a "checkpoint," so no I don't support that now but yes, I figure I will eventually. 2023-05-14 08:59:44 you need a way to serialize everything you want 2023-05-14 08:59:54 the common way would be some sort of bytecode 2023-05-14 09:00:33 it is expensive, but you said you wanted to output to a disk 2023-05-14 09:00:49 you need to deserialize it later 2023-05-14 09:01:09 how you represent this data is the most important part of the whole process 2023-05-14 09:01:27 as some book told me: Data is more important than algorithms 2023-05-14 09:01:40 and mainly data representation affects the whole algorithm 2023-05-14 09:02:47 crc has done this already I guess 2023-05-14 09:03:02 there is Lore that Data ... 2023-05-14 09:03:14 he can make a vm image and load it from a file or whatever 2023-05-14 09:05:20 Well, vms14: the main idea is to use Forth source code to store things, and then you just load and compile it. I'm not going to "serialize" for this image save - I've got a plan for how to write the RAM regions out to blocks. 2023-05-14 09:05:36 It will be basically a binary format, though. 2023-05-14 09:05:46 if you don't need to output to a file, it's easier 2023-05-14 09:06:14 you already have that 2023-05-14 09:07:53 I think you can chain restore snapshots if you also save the current restore snapshot 2023-05-14 09:08:22 say every line you save the state, you also save what was saved in the previous line, kind of a linked list 2023-05-14 09:08:59 well won't work unless you save all this into memory and mantain it, so meh 2023-05-14 09:09:23 a single checkpoint is already too expensive for a forthwright 2023-05-14 09:10:52 and there's the rule that you don't have to implement what you don't already need 2023-05-14 09:11:11 yagni, for short 2023-05-14 09:12:02 but if it's all about research, then no rules exist :D 2023-05-14 09:12:09 no rules for me 2023-05-14 09:13:20 Yeah, the snapshotting dovetails with command history. 2023-05-14 09:13:30 But I'm not *interested* in saving a whole history of snapshots. 2023-05-14 09:13:51 I just keep my last proven good state so I can restore it if my attempt to move forward further fails. 2023-05-14 09:13:53 you could limit it to 10, but you said already you don't have the need for more than one 2023-05-14 09:13:56 It's enough for my needs. 2023-05-14 09:14:09 what I would be interested in is to be able to set a checkpoint at any time 2023-05-14 09:14:14 It's already an expensive feature in terms of RAM - I don't want dozens of these snapshots hanging around. 2023-05-14 09:14:37 That's a totally different thing, and as I said, I think on this next system I will be able to write a system out to a set of disk blocks. 2023-05-14 09:14:50 But that will be something I do manually when I choose to. 2023-05-14 09:15:25 It's really fairly simmple - I'll have four or five RAM regions that serve different purposes in my system. 2023-05-14 09:15:38 I'll just write each one out to a block / some blocks. 2023-05-14 09:15:51 "de-converting" addresses where necessary. 2023-05-14 09:16:20 oh, simple multitasking could be derived from that 2023-05-14 09:16:23 The only difference between an image in blocks and one in RAM will be that the block image has all offsets and no addresses. 2023-05-14 09:16:56 Well, the way I plan this next system it should be entirely possible to have multiple console sessions running. 2023-05-14 09:17:09 Something that operates kind of like screen. 2023-05-14 09:17:37 It's going to support multi-threading, and any thread could have a console if it wanted. 2023-05-14 09:18:11 I don't intend to try to support having a bunch of threads all compiling at the same time, though. 2023-05-14 09:19:23 I have increasing interest in a language based in executing commands 2023-05-14 09:19:36 any command would be a separated thread xD 2023-05-14 09:19:42 Zarutian_iPad: those builds> does> definitions we wound up with at the end last night are 38 characters long each. Now that's the kind of definition I like. 2023-05-14 09:20:15 but the thing that interests me more is that no matters the language the command is written 2023-05-14 09:20:40 :-) Then your interests are somewhat remote from Forth at the moment. 2023-05-14 09:20:41 a real programmer knows every programming language has better use cases than others 2023-05-14 09:20:43 But that's fine. 2023-05-14 09:21:27 https://madhadron.com/programming/seven_ur_languages.html 2023-05-14 09:21:43 That guy contends that knowing one of each major "type" is adequate, and that makes sense to me. 2023-05-14 09:21:58 He identifies seven major "families." 2023-05-14 09:22:15 Each with a "prototypical" language. 2023-05-14 09:23:17 I'm interested in the "capabilities" of the various languages, but what I'd like most if to have those capabilities (or as many as feasible) unified under a one-language hood. 2023-05-14 09:23:49 For example, I'd like to be able to "extend" my Forth to support types and objects and so on, but it would still "feel" a lot like the original Forth. 2023-05-14 09:24:15 maybe I load up a custom interpreter for some particular situation, like numerical analysis, etc. 2023-05-14 09:24:29 And when I'm done quit out of that interpreter back to the base system. 2023-05-14 09:24:57 So the basic Forth would be like a "manager" that could launch more sophisticated language processing facilities. 2023-05-14 09:25:24 I mainly meant for example you'd use perl awk or sed for a text related task rather than maybe C Java php etc 2023-05-14 09:26:18 you use sql for mysql, etc 2023-05-14 09:26:56 so if you can build a program using a combination of several programming languages, you can use the best suited language for every part of the program 2023-05-14 09:27:12 it's just that this implies fork and exec and it's a bit annoying 2023-05-14 09:27:13 I know, and that makes total sense. But I'd prefer to use a common foundation. 2023-05-14 09:27:37 One of the things I love about Forth is that it maintains a consistent "syntax" regardless of how far you've extended it. 2023-05-14 09:28:03 KipIngram: that's why, a word can be a whole different word 2023-05-14 09:28:16 when you enter a word, you start a journey xD 2023-05-14 09:28:26 Yes. You don't have the functions you add "looking different" from the native words. 2023-05-14 09:28:49 it will unify all those languages 2023-05-14 09:28:57 In C your interface to a self-written function looks VERY DIFFERENT from a basic expression, for example. 2023-05-14 09:29:29 But in Forth your "new function" is just another word. 2023-05-14 09:31:27 All languages give you a way to add functionality. Forth and Lisp are the only ones I know that let you "change the language" in a real way. 2023-05-14 09:31:52 a colon word would combine several languages (programs) in its definition 2023-05-14 09:32:20 I guess there's no reason you couldn't do that, but I don't have much interest in it. 2023-05-14 09:32:40 That feels to me a lot like writing new tools for Linux. 2023-05-14 09:32:48 yeah, I'm wondering about whether is worth 2023-05-14 09:32:48 You can run any of them from the Linux command line. 2023-05-14 09:32:58 I like the decoupling 2023-05-14 09:33:16 and everyone could extend it using its preferred lang 2023-05-14 09:33:26 My interest is almost entirely at the bare metal end of the spectrum - I'm interested in a "slick" way to manage the hardware resources. 2023-05-14 09:33:27 the only requirement is read from stdin, write to stdout 2023-05-14 09:34:19 words could be files XD 2023-05-14 09:34:37 If I were really doing this right I'd be writing code to manage all the processor's memory management hardware (descriptor tables and so on). But that's difficult when you're coexisting with an operating system, so... later. 2023-05-14 09:35:21 For now I'll just give the system a huge block of RAM and manage it with software. 2023-05-14 09:35:46 ACTION wonders about a folder being the dictionary 2023-05-14 09:36:11 Forth has vocabularies, which let you manage the structure of your namespace. 2023-05-14 09:36:24 It's still one "dictionary," but the word lists get a "tree structure." 2023-05-14 09:36:32 vocabularies/main/+ 2023-05-14 09:37:18 But in Forth that has little to do with any kind of file system, since typically you don't have one. 2023-05-14 09:37:36 the find command would actually be used to find a word 2023-05-14 09:37:52 find vocabularies '+' 2023-05-14 09:37:57 :-) Yes, that's what it does. 2023-05-14 09:38:10 In my system I have a variable PATH that points to some vocabularly. 2023-05-14 09:38:29 That's the first voc of a linked list of vocs - FIND searches them in order and only fails after it's tried all of them. 2023-05-14 09:38:43 And there's another variable CURR which designates which vocabulary to add new definitions into. 2023-05-14 09:38:51 ln `which find` vocabularies/core/find 2023-05-14 09:39:02 Executing vocabularly words lets you modify that search order. 2023-05-14 09:39:12 Take vocabularies out of it, add new ones in, etc. 2023-05-14 09:39:25 oh and forget can use the timestamp 2023-05-14 09:39:38 ahahaha 2023-05-14 09:39:46 I think you're drifting into various aspects of file systems here. 2023-05-14 09:39:53 Completely different thing. 2023-05-14 09:40:16 forget needs to remove all words defined after the word you remove 2023-05-14 09:40:27 But I think if you intend to use a system for a wide variety of work, you likely must have one. 2023-05-14 09:40:30 so you can look at their timestamps 2023-05-14 09:40:41 Well, at least it would make things a lot easier. 2023-05-14 09:41:15 I'm of the opinion that b-trees are good for organizing a file system. 2023-05-14 09:42:24 A big reason I intend to ultimately have one is that I want to integrate how I comment and document in with that. 2023-05-14 09:42:40 I want to be able to have hyperlinks in my source to comments and documentation. 2023-05-14 09:42:44 KipIngram: are you going to add literate programming in your forth? 2023-05-14 09:42:55 You'll have to tell me what you mean by that. 2023-05-14 09:43:07 I know what "literate" means in general,m but I sense you have something very specific in mind. 2023-05-14 09:43:13 literate programming is just document and code at the same time 2023-05-14 09:43:24 Oh, yes - I very much want to do that. 2023-05-14 09:43:26 usually using some tool that separates code from documentation 2023-05-14 09:43:34 and generates html, pdf etc 2023-05-14 09:43:41 I want to be able to be coding and just issue a key sequence and have a new window open that I can put documentation in. 2023-05-14 09:43:44 example: cweb 2023-05-14 09:43:55 Maybe on that last point. 2023-05-14 09:44:05 It would certainly be something the basic idea could support. 2023-05-14 09:44:28 https://en.wikipedia.org/wiki/Web_(programming_system) 2023-05-14 09:44:33 It'll just support entering text - what kind of functional format that text had will be flexible. 2023-05-14 09:45:14 it consists of two primary programs: CTANGLE, which produces compilable C code from the source texts, and CWEAVE, which produces nicely-formatted printable documentation using TeX. 2023-05-14 09:45:25 It'll really just be founded on the ability to create links between arbitrary fields in disk blocks. 2023-05-14 09:45:32 Stored in a b-tree. 2023-05-14 09:46:13 That is, there won't actually be any physical link content in the blocks - a separate b-tree will just say (location, location) and all those pairs will be stored in a way I can quickly search. 2023-05-14 09:46:20 javadoc would be another example 2023-05-14 09:46:28 So wherever I am in my code, I can look that location up and see if any links connect to it. 2023-05-14 09:46:37 I kind of like javadoc, except for the stupid amount of files it generates 2023-05-14 09:46:51 but it's java after all, it has to be like that 2023-05-14 09:46:51 If one does, I'll be able to follow it. 2023-05-14 09:47:36 oh yeah you told me about that 2023-05-14 09:47:47 you wanted an editor that can show documentation 2023-05-14 09:48:01 it was a cool idea 2023-05-14 09:48:02 Yes, and also with an integrated profiler / debugger. 2023-05-14 09:49:21 I need to add some way to document stuff 2023-05-14 09:49:27 then use it to document my lang 2023-05-14 09:49:43 I only had a database which I liked 2023-05-14 09:50:19 I described the arguments a word takes, what returns, example usage, related words... 2023-05-14 09:50:35 that went to a database that the language will open at start 2023-05-14 09:50:51 'word doc would read the documentation of that word in the database 2023-05-14 09:50:57 it was cool 2023-05-14 09:51:46 I tend to forget the order of arguments in some words 2023-05-14 09:52:03 'word doc was nice to remember them 2023-05-14 09:52:49 You're slightly all over the map this morning. :-) 2023-05-14 09:53:15 what do you mean? 2023-05-14 09:53:24 Lots of areas of interest on your mind. 2023-05-14 09:53:33 ah, it's always like that 2023-05-14 09:53:43 I enjoy learning 2023-05-14 09:53:44 Not a criticism. 2023-05-14 09:53:53 I know what you mean. 2023-05-14 09:54:32 I have a wild imagination, I'd say it's my best feature xD 2023-05-14 09:55:13 it just can't stop, but it helps me a lot to imagine some circumstances and the effects they could give 2023-05-14 09:55:35 I use it to make analisis xD 2023-05-14 09:56:46 analysis* 2023-05-14 10:09:15 So, now that I have builds> does>, vocabularies will go with 2023-05-14 10:09:34 : voc builds> 0 , 0 , 0 , does>> ...something... ; 2023-05-14 10:09:39 Ooops. does> 2023-05-14 10:10:09 ...something... will basically take the vocabularly and remove it from the doubly linked list search path, if it's in there already, and then add it to the beginning of that path. 2023-05-14 10:10:45 If the link fields are already zero, it's not in the path currently and will just get added. 2023-05-14 10:11:29 Then I'll need a couple of other words for other operations, like just dropping a vocabulary from the path, making the first voc on the path the "current" vocabulary, and so on. 2023-05-14 10:11:40 Won't be much code overall - just a few lines. 2023-05-14 10:12:24 I'll have to either go dig up or "re-remember" the code for managing a doubly linked list. It can be done rather elegantly, but only if you get it written just right. 2023-05-14 10:24:25 vms14:; in typical forth the word "definitions" takes the first vocabulary in the search path and makes it "current" so it will receive definitions. 2023-05-14 10:24:30 I usually call it defs. 2023-05-14 10:24:53 So you'd say " defs" and now new words go into that vocabulary. 2023-05-14 10:25:22 And you're also searching that vocabulary first, since made it that way, but if you don't want that you can pop it off of the list. 2023-05-14 10:25:39 defs vdrop 2023-05-14 10:25:40 or something. 2023-05-14 10:27:03 KipIngram: I think maybe you're right in that I have a lot of thoughts today 2023-05-14 10:27:04 I need to tidy up a little - a few days ago I decided I wanted to change my vocabulary layout from to . I may unwind that change or I may keep it but adjust things in a different way from how I did it. I kind of "cheated" a little to accommodate that change, and I don't much like it. 2023-05-14 10:27:24 It seems just a little more than usual, though as you say you're always a person of wide ranging interests. 2023-05-14 10:27:37 May just mean you're well-rested so have a lot of mental energy at the moment. 2023-05-14 10:28:06 that posix journey I had when I reinstalled netbsd while the router was dying and got me stuck with a system with only posix stuff and ctwm was kind of illuminating 2023-05-14 10:28:10 :D 2023-05-14 10:28:19 The reason I made that change was that I felt like if I always have links at the beginning of structures, it would be easier to use a universal set of list management words. 2023-05-14 10:28:30 But I'm questioning now whether that's really "necessary." 2023-05-14 10:28:46 Really as long as the links are always next to each other things ought to work out fine. 2023-05-14 10:31:17 I also think it's high time I write ." 2023-05-14 10:31:23 I've been stumbling along without it. 2023-05-14 10:31:48 Just using . and emit. 2023-05-14 10:32:00 I like emit 2023-05-14 10:32:14 it shown me what the real answer of everything is 2023-05-14 10:32:17 42 emit 2023-05-14 10:32:25 :-) 2023-05-14 10:32:33 My key and emit will deal with utf8. 2023-05-14 10:32:52 The items they work with might be multi-byte, but all utf8 chars will still fit in a stack cell, so... 2023-05-14 10:32:56 I can't implement key :/ 2023-05-14 10:33:07 It's tedious to get setup for that. 2023-05-14 10:33:09 well I can, but I usually don't 2023-05-14 10:33:15 You have to dick with the termios. 2023-05-14 10:33:37 And doing that in a way that gets things properly restored on exit is a bit of a pain. 2023-05-14 10:34:49 I got the vocabulary layout changed back to its original order. 2023-05-14 10:35:23 The list management words will just have to be given pointers to the forward link field. 2023-05-14 10:35:54 Or perhaps the offset of the forward link field in the structure - that seems more likely. 2023-05-14 10:36:09 That might vary from case to case. 2023-05-14 10:42:04 vms14: https://ibb.co/WBzdYkx this is what's become of trying to use with RPN 2023-05-14 10:46:03 unjust: I had some basic canvas stuff time ago in a js implementation, but I guess it was lost 2023-05-14 10:46:44 it seems like canvas's API borrowed from postscript 2023-05-14 10:46:53 https://vms.neocities.org/xd 2023-05-14 10:46:56 lol 2023-05-14 10:47:00 it still works 2023-05-14 10:47:01 hahaha 2023-05-14 10:47:43 ohh it's cause it's the whole lang embedded in a