2023-08-20 00:03:11 Well, I know the outlines of it. It's just never made sense to me what I would really use it for. 2023-08-20 00:03:49 At least not to the extent IMMEDIATE makes sense. 2023-08-20 00:04:19 I mean, why wouldn't I just have made ABC non-immediate to start with? 2023-08-20 00:04:38 If I wanted to use it non-immediately? 2023-08-20 00:05:22 What's a use case where I'd need to make a word IMMEDIATE and then later need to use it non-immediately? 2023-08-20 00:06:23 Maybe I just do the wrong kind of applications for it to seem useful to me. 2023-08-20 03:21:43 I never learnt what postpone really does 2023-08-20 05:17:28 POSTPONE is a fancy ANS Forth word that's too smart, with aim of being portable. It chooses ['] NAME COMPILE, or [COMPILE] NAME based on whether NAME is immediate 2023-08-20 05:17:42 If NAME is immediate it does [COMPILE] NAME 2023-08-20 05:17:51 If NAME is not immediate it does ['] NAME COMPILE, 2023-08-20 05:18:12 So basically it postpones the "compilation semantics" for NAME to execution of the current definition 2023-08-20 05:18:20 (In log in case vms14 reads it) 2023-08-20 05:26:37 I forget that not everyone is bouncing through znc. 2023-08-20 07:46:03 xelxebar: I'm not - I have weechat curses running on an always on virtual server and I have a console connection to that system using mosh. Mosh maintains persistent ssh connections and automatically re-connects them whenever the client system comes online. Makes ssh connections to remote systems behave like local console sessions as far as connectivity goes. 2023-08-20 07:46:30 At the time I set this up the goal was to avoid having to re-connect every time I went online; I was unaware of znc then. 2023-08-20 07:46:48 Plus I have a preference for console connections over browser connections. 2023-08-20 07:47:46 Cool. That's definitely a route I considered, too. I'm on weechat and use mosh everywhere on my vpses. 2023-08-20 07:48:56 Just went with znc because it's The Bouncerâ„¢. FWIW, znc is completely configurable via your IRC client, so no need to mess with browser stuff. That's what I stick to. 2023-08-20 07:50:04 But, that said, about the only added nicety of znc is that it allows you to connect via multiple clients at once, so you can have multiple devices all synced. 2023-08-20 08:27:33 Happy to hear you use mosh too. I recommend it to everyone I can - I read that it was a project done by a graduate student somewhere, and I've just always loved how it is simple and clean and "just works." I use it for all of my own connectivity tasks - at work they have us use some VPN type thing done up by AT&T, and it's clunky and flakey more than you'd believe. As far as I'm concerned the kid ran 2023-08-20 08:27:34 circles around AT&T. 2023-08-20 08:27:57 I realize it's not quite the same functionality, but the two things sit in similar places in their respective workflows. 2023-08-20 08:28:30 The AT&T thing won't even auto-reconnect; I have to punch a button on it every time I wake up my computer. 2023-08-20 08:28:59 At least the window in which I do that pops up naturally, and then hides itself when the connection is made. 2023-08-20 08:30:12 I'd go so far to say that if I were to write down a list of my "favorite software packages," mosh would likely be in the #1 position. 2023-08-20 08:30:47 IIRC, that grad student was at MIT. 2023-08-20 08:33:58 So, I sussed out some further details of this F18A-emulating code threaded system. First will come a word's header, and by that I mean only link field and name string. For : definitions, the vm code will begin immediately following the name string (name strings will be padded out with zeroes to the next four byte boundary). For variables and constants, there will be one 32-bit cell of code immediateely 2023-08-20 08:34:00 after the name string, and the data field of the var/const will follow that. One cell is enough for code that will push either the address of the data cell or the contents of the data cell and return. So words will get executed by a call to that location. 2023-08-20 08:34:19 So it looks somewhat like a code threaded system, but for variables and constants it will have elements of direct threading too. 2023-08-20 08:34:47 It's just that for : defs no "generic" code is required at the called location - the code of the definition can simply start there. 2023-08-20 08:35:07 Rather like how in a direct threaded system the code for a primitive could just "start" at tHE CFA. 2023-08-20 08:37:57 It may turn out that even for CREATE/DOES> there's enough room in that cell to implement what needs to be done. For those words, we want to push the data field address and then jump to code somewhere. So, one six-bit instruction slot to push the address (which will be sitting in the instruction pointer at the time), one six bit slot for the jump opcode. That leaves 20 bits for address, which can target a 4 2023-08-20 08:37:59 MB range, since it specifies a 32-bit boundary. 2023-08-20 08:38:35 So as long as the create/does> code is within 4 MB distance, that can work. 2023-08-20 08:40:16 For one-character word names, the header will only be four bytes. Eight bytes will get us up to five chars, and that covers the vast majority of my words. 2023-08-20 08:46:03 This is going to be a very compact system - it won't surprise me if it winds up being only 5kB-6kB out of the box. 2023-08-20 08:50:30 It looks to me like ability to inline vm instructions is a natural part of the architecture. For example, take dup. Dup is a vm instruction, but it's also a word I want to be able to compile or execute. So it has to have a dictionary entry. To interpret dup, looks to me like I want to be able to call its definition. So sitting there at its CFA will be two vm instructions; dup and return. So, when 2023-08-20 08:50:32 compiling dup I could just compile a call to that, but that would be terrible performance. So I'll want the compiler to see that it's really just one instruction long, extract that instruction from the definition, and compile it. 2023-08-20 08:51:03 Since I'm doing that, I may as well do the same for any definition that is "short." 2023-08-20 08:56:08 In this system, it strikes me that the logical function of CREATE will be to just make a header. No population of the CFA field at all. For : defs, that's what you want - the code compiled after starts immediately after the header. Then : VARIABLE CREATE , 4 ALLOT ; 2023-08-20 08:56:32 And : CONSTANT CREATE , , ; 2023-08-20 08:57:10 will push IP and return; will fetch using IP and return. 2023-08-20 08:58:20 And as noted above, create/does> will push IP and jump to the does> code. 2023-08-20 09:16:39 So, at the time I actually execute a jump or call instruction, the operand for that will be sitting in my instruction register - all shifted down to the LSB position. So I think all that will be needed there will be to push the IP to the return stack if it's a call, left shift the operand two bits, and add it to IP. 2023-08-20 09:17:23 Using relative values like that is nice, because it means defined "nearby" will get shorter operands, more likely to fit in the remainder of a cell. 2023-08-20 09:17:50 Everything about this is looking brilliantly simple. 2023-08-20 09:18:37 Relative offsets also make the vm code relocatable. 2023-08-20 09:19:10 At the moment I haven't thought of anything that will break that relocatability. 2023-08-20 09:21:01 I'd have to be careful if I inline a definition that contains a call. The operand would need to change. 2023-08-20 09:24:34 In the Python definition of this system it's shaping up to look a bit like this: 2023-08-20 09:24:49 header('name', bits) ; define('op op op ...') 2023-08-20 09:25:19 header() is written. define() not yet. 2023-08-20 09:25:45 But compile(op), where op is resolved to a numeric value, is written. 2023-08-20 09:31:23 As is compile_val(op, val) which will cover jump, call, lit... 2023-08-20 10:29:42 xelxebar: I think libera.chat should support IRCv3 chathistory, although that's possibly controversial 2023-08-20 10:30:15 It makes a lot of sense for them though, would reduce their traffic considerably and make it more usable for many people 2023-08-20 10:30:34 But they like to say they "do not log" the chat history... which is silly because it's mostly public 2023-08-20 10:30:42 And they could just not support it for private messages 2023-08-20 10:31:49 And if you don't trust libera to log then why do you trust them to be a node in the conversation at all anyway? 2023-08-20 10:59:29 Yes - the mere fact we're using them implies that we're trusting them with whatever content we opt to put here. 2023-08-20 10:59:58 It's a free choice. Sure, we can read their promises of behavior and be pleased or not with them, but in the end they can do anything they want and they don't HAVE to tell us. 2023-08-20 11:00:25 In a lot of ways it's the same situation that applies to the "admins" of any computer system. 2023-08-20 11:00:40 Which is one of the value points for "personal" computers. 2023-08-20 11:01:04 Of course these days I don't really trust my personal computer to be private either. 2023-08-20 11:01:54 I just tell myself that there's nothing about me that would really be of interest to anyone. 2023-08-20 11:02:35 So I finally found an article on gauge theory that I could actually follow. Most discussions of that are hopelessly complicated and obtuse. 2023-08-20 11:03:45 One thing I learned that I hadn't known before is that given how quantum theory works, if you try to build a theory of non-distinguishable particles that do not interact at all, you'll fail. 2023-08-20 11:04:06 It just won't work. Some interaction is required for self-consistency, and for spin 1/2 particles that interaction is electromagnetism. 2023-08-20 11:04:21 So EM is not an "optional feature" of the world - given spin 1/2, it's a necessity. 2023-08-20 11:05:35 I did already know it was a necessity from an alternate analysis - that paper I've talked about a few times shows how it's a consequence of there existing at least one conserved quantity in nature.