HN user

Jach

11,154 karma

Email: jachhn ~at~ thejach.com Do not harvest and contact my email to advertise your stupid app. That is spam.

PGP key (for email alias): https://www.thejach.com/about#pgp

Available for IM on Matrix/Element -- Jach#matrix.org. Discord as jach9107. Sometimes on Libera IRC as Jach or Jachy. Hit me up if you want to chat about anything; I'm bad at reaching out myself.

I'm just some unimportant programmer, dabbler by nature, you probably shouldn't listen to me but that doesn't always stop me from commenting or giving advice.

Please excuse my Common Lisp evangelism, I'm just a poser who after a journey from PHP through Java, Python, C, C++, JS, Scheme, and Clojure, just loves the language, enjoys programming anything in it, and has fun trying to correct decades-old misconceptions about it. Maybe by the time I'm 50 I'll have more to show for it. i.e. I think it's better to write cool programs in Lisp than to evangelize, and I'm failing to live up to my own standards.

I've collected some stuff I occasionally link in comments here in one place: https://www.thejach.com/view/2022/1/thoughts_on_writings_on_lisp

I'm not currently employed -- I did a speed-run to quasi-retirement in 2020.

I have a BS Degree in Computer Engineering from a school more renowned for degrees in video game [engine] programming.

I'm located in Bellevue, WA, feel free to get in touch for coffee/dinner/whatever if you're in the Seattle area. Or even if you're not, maybe we can play some online games. I like to visit Japan, too. でも、私の日本語は下手です。

Posts127
Comments4,432
View on HN
intelligence.org 1mo ago

Response to Cegłowski on Superintelligence (2017)

Jach
3pts0
coalton-lang.github.io 2mo ago

Mine, a Coalton and Common Lisp IDE

Jach
112pts6
www.youtube.com 3mo ago

Black Hat USA 2025 – HTTP/1.1 Must Die the Desync Endgame [video]

Jach
3pts0
github.com 7mo ago

Open Community License

Jach
2pts1
medium.com 7mo ago

Giving Mars a Magnetosphere (2018)

Jach
8pts0
www.catb.org 3y ago

On Management and the Maginot Line

Jach
26pts27
gource.io 4y ago

Gource – a software version control visualization tool

Jach
5pts0
www.youtube.com 4y ago

Hyperbolic Tree Browser – CHI 1995 – Ramana Rao and John Lamping

Jach
2pts0
united3dartists.com 4y ago

Nichimen Mirai Images Thread – 20 Year Anniversary (2019)

Jach
3pts0
clqr.boundp.org 5y ago

Common Lisp Quick Reference

Jach
2pts0
github.com 5y ago

Dynace – Object-Oriented Extension to C

Jach
5pts0
spectrum.ieee.org 5y ago

Video Game Approved as Prescription Medicine

Jach
2pts1
www.youtube.com 6y ago

Cursed Problems in Game Design

Jach
1pts0
www.joelonsoftware.com 6y ago

Evidence Based Scheduling

Jach
4pts0
home.pipeline.com 6y ago

The Treadmill: Real-Time Garbage Collection Without Motion Sickness

Jach
2pts0
apps.dtic.mil 6y ago

What a Software Engineer Needs to Know: 1. Program Vocabulary (1989) [pdf]

Jach
1pts0
home.pipeline.com 6y ago

I Have a Feeling We're Not in Emerald City Anymore (1997)

Jach
1pts0
yosefk.com 6y ago

The Nomadic Programmer (2009)

Jach
1pts0
craigsmith.id.au 6y ago

Agile Methods in 40 Minutes

Jach
1pts1
factorio.com 6y ago

The Multiplayer Megapacket

Jach
1pts0
jeffjonas.typepad.com 7y ago

Privacy by Design in the Age of Big Data [pdf]

Jach
2pts0
github.com 7y ago

Shop3 – Hierarchical Task Planner in Common Lisp

Jach
94pts2
www.laputan.org 7y ago

Big Ball of Mud

Jach
2pts0
youtube.com 7y ago

Why Black Boxes Are So Hard to Reuse, Lecture by Gregor Kiczales

Jach
5pts0
events.tymoon.eu 7y ago

Autumn Lisp Game Jam 2018

Jach
3pts0
www.zdnet.com 7y ago

​Linux gaming gets a new head of Steam

Jach
3pts0
dreamsongs.com 8y ago

The Structure of a Programming Language Revolution [pdf]

Jach
7pts2
www.brainpreservation.org 8y ago

Aldehyde Stabilized Cryopreserved Pig Brain Evaluation Images

Jach
1pts0
alphagoteach.deepmind.com 8y ago

AlphaGo Teach – Find new and creative ways of playing Go

Jach
99pts23
viagenpets.com 9y ago

ViaGen Pet Cloning Company

Jach
2pts0
Resetting Xbox 15 days ago

The Xbox can't even reliably play video trailers of the games MS in theory want to sell you. They don't even require every game to have a video. They don't even require every game to have a screenshot, as I've encountered some that don't even do that! Fundamentally unserious about making a good experience.

If you’re not going to take responsibility for your bugs I don’t want to work with you.

Depends on what "taking responsibility" means.

Don’t make other people QA your work; if you’re not able to figure out how to do that yourself while you work you’re legitimately bad at your job.

At a distance I agree with this, but closer to the details, eh... Having worked with excellent QA and QE people, they just think differently than I and other programmers I've worked with do, in a useful way, so I think it's a shame (even if understandable) how such roles have been killed industry wide for over a decade. "Hybrid" doesn't really cut it. But yes, I get pissed when a code review comes my way and the author clearly didn't bother to even run their own code because when I notice something wrong and try it, lo and behold it doesn't work. I imagine some even less competent places throw over reviews (or just push straight to master) that don't even compile. I won't get into basic automated testing. I believe programmers should have a professional ethos to learn new things to make themselves better at their craft, with or without management support or even paid company time for it, this includes ways to think about better achieving quality goals.

Once you leave an employer obviously you have no obligation to fix bugs in IP you don’t own or anything.

This is the crux of the issue: the employer always owns the code, not the individual, and so to me it's the employer's job to be responsible for any defects. A sensible employer probably recognizes that often the author of the code is the best one to fix it -- but this is also part of why it's so important to have code reviews, because then in theory you have at least two people who are somewhat familiar with the code. At the same time, coding, like everything else, is subject to stochastic quality issues. Employees work within a system, many issues are caused by the system, and only management can change the system. Take some lessons from Deming's red bead experiment: https://www.youtube.com/watch?v=7pXu0qxtWPg (Write-up: https://web.archive.org/web/20251212234933/https://maaw.info...)

I just accept I'll miss things / get some sub-optimal outcomes for my first play, though I do try to explore a lot and sometimes player messages help rather than troll/spoil/be funny. Guides only come out for NG+ and beyond.

A friend let me host a site on his server, I learned to use FTP (with a firefox add-on he recommended) to copy up HTML files. Later he saw how much duplication I was doing and showed me the humble include statement while using PHP, and pointed towards a book, and I learned to program that way by uploading PHP scripts and running them by visiting their URL. It was some time later before I succeeded in installing a local WAMP stack, even later switching to Linux at home, but if that was a prerequisite I might have bounced. Web technology even just from the backend perspective was a huge enabler.

Still, I don't know if such things are the biggest obstacles, I remember the conceptual hurdle of the for loop syntax being pretty difficult to overcome. (I crashed my friend's server once with a very long loop echoing stuff each iteration that I might have tried opening in multiple tabs at once too.)

I've also seen such initial setup hurdles justified as filters: if you can't handle this, well, programming is full of such obstacles (bigger, smaller, or about the same size left unstated), so maybe it's for the best you just give up now since you probably won't make it. I generally don't like that excuse, and appreciate that getting into programming has been made so easy, but at the same time when a lot of effort has been made into making something so easy (even if not quite as easy as it could be, or as easy as something else) and people still bounce off their first setup difficulty, I sympathize with those who think good riddance, especially if the person isn't an absolute beginner. The horse and water adage always applies.

You are assuming symmetries where there are none. I want a thing, discover it's readily available for $1300, that seems insane, so I don't buy it. By chance I acquire the thing from a source that was unaware of its fair market value for $2, amazing deal. I have the thing without having to pay an insane price, I am happy. Now here comes an insane person who wants it enough to offer me $1300. Both parties must benefit from an exchange for there to be a transaction, but the benefit is always subjective to them, depends on public and private information, there's no symmetry in buying/selling, and the equations have inequalities rather than equal signs. Now if the offer is sufficiently higher than $1300, or I know I can find the thing again for sufficiently less, or I find myself in need of the $1298 unrealized gain for other things, then sure, it becomes insane to not sell, but absent such factors refusing a fair market offer at a price you wouldn't ever entertain paying yourself is not insane. Additionally, prices aren't static, platonic things. If someone is insane enough to offer $1300, perhaps they are insane enough to offer $2600 in a year, I will be enjoying the thing in the meantime.

Undertale is certainly a unique experience and should be played as blind as possible, I understand why people love it. The things it does knowing it's a game are great. Personally I ended up not liking it in the end, but it's a begrudging dislike and I think any gamer should at least try it. It (and its fanbase) offer yet another perspective on choice and control. I only did one playthrough, though, and don't plan on another. Reflecting on a bit of dialogue at the end, I agreed with the character, and called it quits and moved on to other games.

I appreciate the experience report, it's interesting to hear the differences, and it's fun to think back on SOMA after not thinking about it for years. There was a funny discussion elsewhere recently about movie tie-in games that this reminded me of. For a 007 game, someone identified as James Bond while playing, but because they sucked at the game and kept dying, they felt very drawn out of the experience and un-immersed. "James Bond wouldn't die."

Do you read novels that narrate with the first person "I" differently than you read novels that don't? (For me there's no difference.)

In games, what matters to me when it comes to immersion or even how much I put of myself into it, isn't anything like camera perspective, but the level of control I have (or think I have). There's two types of control, the first being over the character(s) I'm puppeteering/piloting. It goes beyond just their movements and includes their behavior, thoughts, words, and what they don't do as much as what they do. The second is control over the narrative or story. If the world or story or other characters actually change or react to things I do or don't do, that does help sell me on the idea that I have some control. There's a huge variety in how different games tweak these knobs, and sometimes control is given in just lack of resistance. For example, the Half Life series doesn't offer much meaningful control over either the character of Freeman or the plot, but because Freeman is under-developed and silent, there's no resistance to playing him as you please within the confines of the game. I have the illusion of a lot of control over his character. And the game itself has a good amount of environmental control -- you can close doors behind you, if you want. It helps sell the immersion and makes it easier to self-insert, if desired. I played another game where a character kept sending me text messages, and I would just ignore them all instead of replying, but I wasn't playing "me", I was playing a role, and thought it made more sense for the character to stay mad and give the silent treatment. Nothing really came of it but it was fun, like closing doors.

Solid Snake in Metal Gear Solid is much more developed than Freeman, and you have pretty much no control over his characterization, and only one moment of control on the story, so I've never felt like I was Snake, or Snake was me, I was just simply puppeteering him, and was mostly along for the ride like a movie or book. The immersion was still good even if I wasn't directly, personally in it. And being a game, it could have a certain fight which sticks in one's memory forever. Still I felt with Simon the way I felt with Snake, he was too much his own character for me to inhabit. Geralt in the Witcher series is also pretty well-developed, but the game offers a lot more flexibility and control over him, so you can steer him in directions that more resemble yourself, or what you would like to be, or what you want to pretend to be right now because you're curious what happens in the game if you do so. I still never felt like I was Geralt, or Geralt was me, but it was easy to put more of myself into playing. The world itself also changes based on my actions, so much that you can import saves from the previous game when you start the next game to carry over some things. Two of the most immersive games I've played, Gothic 1 and 2, give you a pretty under-developed nameless hero to steer, and insert yourself into if you wish, and a very reactive world and population. It's third-person.

(Probably the majority of my top-rated games have little of either control. Some are Star Fox 64, Mega Man X, Super Mario World, Ikaruga, and Doom. I never think of myself as Fox, X, Mario, Shinra, or Doomguy, or them as me, or even me as role playing them. I'm just piloting them. Same with Bond in Goldeneye for the N64. In those games I'm not usually thinking of the story or themes from moment to moment. I might not be immersed, depending on how exactly you define that, but I'm totally engrossed in the action. Sometimes there are those narrative moments worth reflecting on anyway (the end of Ikaruga is quite tragic when you think about it), but I had no influence over them.)

I'm easily taken out of the whole thing if the game suddenly offers incredible resistance or otherwise breaks established control patterns. A typical example would be winning a fight and then a cutscene plays and gives a scripted loss instead. (Sekiro's opening fight gets a pass, partly because I did lose the first time playing.) Related is if the mechanism of control suddenly changes. If it's an action-oriented boss fight that I win, then a cutscene, then a quick (or not so quick) prompt for "Press X to finish the big bad", I'm pretty irritated.

For consequences, I'm mainly talking about how my actions or non-actions affect the characters themselves, the world and its inhabitants, and/or the story. In SOMA, these kinds of consequences aren't really there. There's one mostly visual consequence near the end for one choice (and it raises some questions about pressure suit construction or whether such a suit was even needed to begin with), but otherwise nothing really comes out of anything you do with the choices you're presented with (unplugging this, killing that, infecting this, erasing that, answering a survey this way (including asking to die)), you just have your own reasons and thoughts about it (like closing doors, or ignoring texts). These aren't bad and can be nice for immersion, but it could have been more. A game as simple as MegaMan X has, as a consequence of beating Chill Penguin, the freezing over of Flame Mammoth's stage, which makes it easier to traverse...

I agree the remark on death consequences not being particular severe (restart/redo a bit) isn't that fair and applies to many games. (Even BioShock has that consequence, it's another one of my top-rated games, it plays with the distinction of who (the player or the game) has what kinds of control in a unique and memorable way, even if a story-affecting choice is kind of minor and lame.) But you don't need to go all the way to sadistic things like deleting the game or what have you to introduce more meaningful consequence. Dark Souls (another favorite) has as its primary death-consequence an additional gameplay aspect where, besides going back to a checkpoint, you need to return to where you died to recover your unspent currency or risk losing it forever if you die again. That mechanic is fundamental to the "souls-like" genre it birthed. Dark Souls 2 goes a bit further by progressively "hollowing" your character with each death, lowering your max HP and making you look more and more zombified, only reversible with an item not sold in unlimited amounts. Some characters react differently to you (or are interactable at all) depending on your state. It's not a flawless execution; it does tie into the underlying narrative theme of hollowing, but as expressed through other characters, that's more about memory loss and loss of purpose, which mainly applies to the player only if they give up and stop playing the game. Still, it's a nice touch that makes the game feel more meaningful and reactive to how you're playing it, even if how well you're playing it (i.e. are you dying a lot) isn't quite the same level of control as pushing the red button, blue button, or walking away.

Another option I've seen other games do is when you die and respawn, you can come across your previous corpse. Works really well for robots. It can be purely visual, or offer something on the gameplay level with looting your old body. It might have been interesting for SOMA to include something like that, and offer a way for Simon to come to grips with the idea of mind copying well in advance. Or further his instability, having to walk over so many of his own bodies.

I can see how talk of a paperclip maximizer, or any sort of AGI that can actually deliver on e.g. Drexler's nanotech or otherwise act in very powerful ways like, to quote, "colonizing the galaxies", pattern-matches to something roughly omnipotent by most of our standards. I can see how it roughly pattern-matches to something like "immortal", but this seems like the least of feats, much of our complex machinery with maintenance is effectively immortal already. Overall I don't see how this connects to what you originally wrote: "There is a common narrative bias to look at AGI as the Abrahamic God, if not explicitly, then just by saying that it is omniscient, omnipotent, immortal - and will judge us for our deeds." It is not omniscient, it only knows enough to develop the tech to enable paperclip maximization. It is not judging, either: "The AI does not hate you, nor does it love you, and you are made of atoms it can use for something else."

I should also note that the paperclip maximizer is not something the LW crowd believes should exist. Its primary function as an idea is to illustrate the orthogonality thesis: that goals and intelligence aren't dependent on each other. Its secondary function is to illustrate instrumental convergence.

It's not you, it's Simon. And Simon is.. kind of dumb. He at least doesn't seem at all familiar with the sci-fi and philosophy topics, so perhaps his reactions are closer to such a person? His confusion and cognitive dissonance might make more sense? (At least the first time -- I'd bet a lot of players got annoyed by his repeat reaction during the ending.) His reactions are to an annoying extent forced onto the player, whether the player identifies with them or not, and the choices are quite narrowly constricted. I didn't share his reactions, or particularly have any confusion or cognitive dissonance. There were choices I wanted to make, or dialogue I wanted to say, that the game didn't make available to me. There also aren't really any consequences to anything, it's pretty much entirely up to you to think about them and whether your actions even did what you think they did, because the game itself is mostly unresponsive to what you do or don't do. (There's not even particularly much consequence to losing to a monster.)

That's not such a bad thing, it would be unfair to compare the game to something that is designed to give quite a lot of player freedom of choice in actions (like Deus Ex) or something constructed more explicitly with different choices and consequences in mind (insert favorite RPG here). SOMA, like the rest of the studio's games, is constructed to be a story-driven walking simulator with horror and puzzle elements. It does quite a bit better than most of that type of game. But I think overall it falls short of the studio's even older games, like Amnesia and especially Penumbra: Black Plague, even if I enjoy the sci-fi elements and setting more and of course the graphics are better. The latter has you controlling a named protagonist as well (Philip) but it leans much more towards the "silent protagonist" trope and that helps make it easier to insert yourself into the experience. (Enough that I had to go and remind myself of his name, even.) It's a different, arguably weaker, plot and has different themes, but it executes really well, especially the shared horror and psychological manipulation aspects. (The overt attempts at horror might be SOMA's weakest point. It didn't need them, the subtler existential horror of everything was good enough.)

I agree it's artful, and again it's not a bad game and I enjoyed it. (I think it took me until maybe 2011 or so to fully realize but I usually enjoy it when a piece of media collects a bunch of topics I like in one expression, even if it's well-trodden ground (at least individually), or even if sometimes the execution is lacking. I like it all the more when the execution is masterful, though.)

EY has said that if diplomacy fails, nations talking to nations, then bombing datacenters becomes the sort of action that's very much on the table. Much like bombing nuclear enrichment sites is on the table after diplomacy fails. He has repeatedly spoken against vigilante acts of violence against datacenters and/or researchers.

Somehow I doubt this will change your mind, so I feel like replying was a waste and I should have left it at rolling my eyes. In theory I'm sympathetic to the view, as I chose to avoid ever going to a local (Seattle-area) LW meetup many years ago after hearing they would start each meeting with a "prayer" (they call them "litanies"), the IRC room was fine enough for me, and I've at times thought some of the Bay Area activity I've heard about seemed not far removed from a sex cult. I don't like groups in general. Regardless, it's still obvious to me that MIRI is not a cult nor EY a cult leader. Line up 10 characteristics of cults and you'll see things don't match up well. Where are the strange evidence-free historical beliefs? Where is the doctrine that only the special few will be saved? Where is the blatant supernaturalism? Where are the calls to renounce jobs, money, possessions, family? From TFA, "These [UFO] people are wearing funny robes and beads, they live in a remote compound, and they speak in unison in a really creepy way." Where are these things? Comparing to Heaven's Gate is insane, it's like comparing Robert Frost to U.S. Code Title 26.

I enjoyed the game but I think its exploration of the topics was pretty shallow. It might be better received if it's someone's first dive into such topics, though. I still enjoy ice cream the nth+1 time eating it, so I can't complain too much about games or anime or books that cater to parts of my interests, even if they fumble some things.

Someday I'd like to play a game that plays with the ideas from Robin Hanson's Age of Em book. One of those is just the multiplicity of artificial minds, so many mind-upload stories revolve too much around one or perhaps at most two (and boring debates over "who is the copy") instances, unless it's a parallel worlds colliding thing which is pretty different. We've seen some of the multiplicity stuff play out in the real world with our non-human AI "agents". Spin up a bunch of artificial minds to work in parallel on some task, let them make notes that stay behind, but then they're all shut down except perhaps one that continues guiding the overall project and making decisions when to spin up more or not.

The Dune series doesn't stop with the first novel, I encourage all who liked the first one to continue reading up through at least God Emperor of Dune. Something the usually ironic calls for a Butlerian Jihad against modern LLMs miss is that even in the Dune universe, it just traded one form of stagnation and tyranny for another, it didn't really improve things. It delayed the threat of human extinction from a race of sentient machines, but such a future is inevitable without the Golden Path, and over the entire time groups like the Ixians were still developing technology to skirt the line.

I don't know who would be paying, but there are many comments here that are semantically indistinguishable from paid shill comments. I don't have a great explanation for it other than people tend to attribute way too much power to whatever random supplements they're on about (you'll see it in vitamin D or B12 threads too, and especially nootropics (which includes creatine) discussions).

Certainly exempt FTEs are crunching and not getting (directly) compensated for it. But the above comment's "overtime pay makes crunches disappear" claim is also simply not the case, just given the still-present abundance of crunch time for non-exempt employees who do get overtime pay.

EA was famously sued ~20 years ago for not paying overtime. They lost and had to reclassify roles to non-exempt and paid up. It impacted hiring decisions for non-exempt/hourly roles (especially QA), encouraged more outsourcing, but this didn't eliminate crunch then, and it hasn't eliminated it since.

That's really my point: overtime-paid crunch is still found all over the place. EA, Activision-Blizzard, Sony's studios, Com2uS, 343 Industries (even with "priority zero"), outsourcing groups like Keywords Studios... They all have crunch stories but they also all make use of both overtime-paid roles and exempt salaried roles during crunch time. If overtime pay eliminated crunch, we'd expect to see a stronger separation in overtime-eligible workers not experiencing crunch, and crunch concentrating entirely in exempt roles. Instead, crunch appears in both.

Furthermore, over the last 20 years, crunch has decreased in both. I think that's better explained by things that directly affect the underlying reasons for crunch like changes to production practices (i.e. patching instead of going gold) and better management practices (i.e. less waterfall methodology). On indirect pressures, it's a broader mix with competition from the rest of tech, cultural backlash against crunch, and sure overtime classification changes. Explicit overtime pay increases the cost of crunch and thus incentivizes figuring out how to reduce it, but it doesn't directly reduce it itself, and certainly doesn't eliminate it.

I wonder about false-positives too, or just disagreements with what is stated vs. "detected". In what I guess is a reaction to the huge amount of AI music, I notice a lot of other music gets posted with titles or tags saying in extent "made without AI". Yet when I listen to it, at least half the time I suspect AI was used, and they are just lying to get increased reach from the AI-hater crowd...

I think learning Common Lisp and learning Coalton are best done separately. For CL the usual reference if you already know how to program is PCL: https://gigamonkeys.com/book/ But the cookbook is invaluable as well: https://lispcookbook.github.io/cl-cookbook/ When it comes to interactive development, looking up resources about SLIME should help since a lot is transferable to the mine environment (or as I prefer, a vim+slimv environment) by having the REPL right there as well as the "beam" metaphor.

For Coalton, I'm still casually exploring it myself. I'm less convinced by the main value propositions (I really like my dynamic typing and CLOS) but I still think it's an interesting language, and being on top of CL means I can mix using it where it makes more sense (even in the same file if I want) without having to abandon CL. I assume you've found the whirlwind tour/awesome-coalton examples for it.. I've seen some usage of it as a way to write "normal" mostly procedural-ish code but with declared types that you know will be checked and used for optimization, so it's sort of like writing PHP with types, or TypeScript, or even in some ways Java or C. e.g.:

    (declare add-two-ints (Integer * Integer -> Integer))
    (define (add-two-ints a b)
      (+ a b))
And (add-two-ints 3.5 5) will type-mismatch.

But I think Coalton's really meant to support writing programs in the style of statically typed languages like Haskell, Ocaml, and F#. Those languages are more than just the above add... style of declaring types, they're about using algebraic data types to model the problem and design your program in those terms. So I'd suggest finding a book or interesting tutorial or sample project in one of those languages, and seeing if you can figure out how to translate it into Coalton, because the Coalton material is still pretty sparse. I've had some success at this by reading "Domain Modeling Made Functional: Tackle Software Complexity with Domain-Driven Design and F#". It really starts at the basics that I think Coalton sort of assumes you understand already. I'll share the main basic things I've taken from it, though I invite any correction.

First, while in many languages we love to pass variables as naked ints and other native types around, making more use of the type system means you can make explicit domain types for these things. You could write something like (define-type-alias CustomerID Integer), and use CustomerID as a type in other types and function definitions. The downside is you don't get a nice constructor for it, and you can accidentally pass CustomerIDs to functions written as only expecting Integers. You can instead write (define-type CustomerID (CustomerID Integer)) and now you'll get a nice little constructor and type errors trying to pass these objects to functions expecting Integers. The downside is you'll need to extract any underlying values with pattern matching/destructuring in match expressions, function arguments, or flattened let expressions.

define-type can be used to model a single thing (like an Integer) but it can also express an "or" relationship, or a "sum type", where a value can be one of several things. e.g.:

    (define-type PaymentMethod
      (CreditCard CreditCardInfo)
      (PayPal     Email)
      (Check      CheckNumber)
      StoreCredit
      Cash)
You might construct a value with something like (Paypal (Email "string@example")), and pass along this object (which is a PaymentMethod) to a function taking a PaymentMethod and doing something to it. You would use the (match ...) syntax to handle the various cases and extract out sub-data as needed. (Note there's none for StoreCredit, it by itself is all the info you need to make a match choice. You could just as well simplify the other two options and look up data elsewhere. In another language you might use enums for this. Having data directly there can be nifty though. e.g. in a state machine with an OrderStatus that's either Unpaid, Paid, Shipped, or Cancelled, you might carry along a Reason string (or richer type) for a Cancelled status...)

define-struct can be used to model "and" relationships, or "product types", for bags of data where all fields are meant to exist at once. e.g.

    (define-struct Widget 
      (name  String)
      (sku   String)
      (price Cents))
Values are constructed like (Widget "Anvil" "1234" (Cents (* 50 100))) and individual data can be pulled out with accessors like (.name my-anvil).

Lastly you have type classes, which can be used for polymorphism in an interfaces sense. For a contrived example you might want to write a generic calculate-total-tax function that works for either Widgets (taxable) or GiftCards (not taxable). The type signature could be: (declare calculate-total-tax ((Taxable :a) => :a * Fraction -> Cents)). That is, it takes some taxable item, and a tax-rate (being lazy with a simple Fraction), and returns a Cents value. That Taxable is a type class constraint, which you define with define-class, along with any functions that make up the complete interface, such as: (get-taxable-amount (:a -> Cents)). You then use define-instance to write a get-taxable-amount function for Widgets (returning a full price), and another for GiftCards (returning 0), and so on if another type comes along. You can also extend built-in type classes this way to support your own new types.

Have we? JS has its async/await syntax, and you can even handle exceptions with less pain (just uh try not to put multiple awaits in a try block). But there are still a gazillion async libraries in npm indicating things missing from the language or older libraries, and then the rest of the JS/TS ecosystem that from my perspective has only doubled down on some of its worst aspects. It looks more like regression when developing similar to how the ClojureScript guys have enjoyed things since at least 2014 seems further away now than it did then, or how it can be controversial when people like dhh push a "no build" approach.

2m isn't going to make Japan allow more than 6 months of stay in a year on a tourist visa. It might be enough to hide yourself from deportation, though who knows what happens when you try to leave. It might be enough to convince a local to get into a sham marriage for spouse visa sponsorship.

Qwen 3.7 Preview 2 months ago

Pretty decent, it's given similar book recommendations as Claude when I feed it my list of read books and thoughts on them. You'll have to tell them to never use emojis. I was using 3.5 a while ago to generate some flavor text while I was playing a bit of an old-school dungeon-crawler game (it's like Wizardry), a genre I don't particularly enjoy much, but it's funner with the flavor text. Worth setting up something like open webui or other front-ends since a pure CLI experience via ollama is pretty bad.

Krita is not very good for photo manipulation. Even basic stuff like rectangle select and selection manipulation is painful. But on a project I used Krita, Gimp, and Inkscape all at the same time, and it was fine. Different tools for different purposes. Though with Gimp 3 having better font/text behavior, and overall allowing to build a pipeline of effects instead of immediately applying them (aka non-destructive editing), I could probably drop Inkscape now.

Or with more Python-esque syntax:

    (let ((files (coerce "ABCDEFGH" 'list))
          (ranks (loop for r from 1 to 9 collect r)))
      [(format nil "~a~a" file rank) (file <- files) (rank <- ranks)])
Based on the list comprehension macro from 1991 in https://3e8.org/pub/scheme/doc/lisp-pointers/v4i2/p16-lapalm... that still works.
    (defmacro comp ((e &rest qs) l2)
      (if (null qs) `(cons ,e ,l2) ; rule A
          (let ((q1 (car qs))
                (q (cdr qs)))
            (if (not (eq (cadr q1) '<-)) ; a generator?
                `(if ,q1 (comp (,e ,@q) ,l2) ,l2) ; rule B
                (let ((v (car q1)) ; rule C
                      (l1 (third q1))
                      (h (gentemp "H-"))
                      (us (gentemp "US-"))
                      (us1 (gentemp "US1-")))
                  `(labels ((,h (,us) ; corresponds to a letrec
                              (if (null ,us) ,l2
                                  (let ((,v (car ,us))
                                        (,us1 (cdr ,us)))
                                    (comp (,e ,@q) (,h ,us1))))))
                     (,h ,l1)))))))

    (defun open-bracket (stream ch)
      (do ((l nil)
           (c (read stream t nil t)(read stream t nil t)))
          ((eq c '|]|) `(comp ,(reverse l) ()))
      (push c l)))

    (defun closing-bracket (stream ch) '|]|)

    (set-macro-character #\[ #'open-bracket)
    (set-macro-character #\] #'closing-bracket)
Supports filtering too, e.g.
    (let ((xs '(1 2 3 4))
          (ys '(1 2 3 4)))
      [(+ x y) (x <- xs) (y <- ys) (evenp x) (oddp y)])
    ; -> (3 5 5 7)
Qwen 3.7 Preview 2 months ago

I sort of thought this about qwen3.5 35b, finally a local model that isn't a complete waste of electricity, but "upgrading" to 3.6 35b left me disappointed. It seemed more like a downgrade. But honestly I've barely used either. Subjectively they still seem far from the frontier models, but for what they can do, it's great to be able to do locally.

"It depends" is usually a safe (if not always helpful) answer. The older idea was that viruses always evolve to be less virulent/deadly, but that didn't match observations. The newer idea is simply that of a virulence-transmission trade-off. But there are various assumptions behind both ideas, and not all viruses follow those assumptions, so.. it depends. A decent review: https://pmc.ncbi.nlm.nih.gov/articles/PMC10066022/