<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><link href="https://quiltro.org/atom.xml" rel="self"/><generator>weavedog</generator><author><email>lobo@quiltro.org</email><uri>https://quiltro.org</uri><name>Javier B. Torres</name></author><id>https://quiltro.org/atom.xml</id><title type="text">Notes from the desk of a wolf</title><updated>2026-04-29T00:00:00-00:00</updated><entry><published>2026-04-29T00:00:00-00:00</published><link href="https://quiltro.org/blog/first-post/" rel="self"/><content type="html">&lt;p&gt;I think I'm warming up to the idea of having a personal blog.
Of course, being myself, I re-wrote my static site generator in OCaml, and then re-wrote it again just to add support for blogging.&lt;/p&gt;
&lt;p&gt;How does it feel?  Good, I think.
Many times ago I tried this I didn't consider the end result worth the effort, so it makes me feel good that now I have a plan for this.&lt;/p&gt;
&lt;p&gt;What goes in a first post?
Maybe a recap of what I've been doing lately:&lt;/p&gt;
&lt;p&gt;Growl, my programming language, was re-written from C to OCaml this month, and gained a static type system based on subtyping along with a type inference algorithm inspired by SimpleSub.&lt;/p&gt;
&lt;p&gt;Currently I'm weighing the benefits of principal type inference in a concatenative language.  Types in applicative languages, like OCaml, are more well-behaved, and give you better errors when something goes wrong.&lt;/p&gt;
&lt;p&gt;In concatenative languages, this is not the case.
I've had to add more and more heuristics to the type inference algorithm to discern from a &amp;quot;good type&amp;quot; and a &amp;quot;bad type that still looks good&amp;quot;, and the existence of type annotations was bolted in after I noticed that some programs give types that are too general.&lt;/p&gt;
&lt;p&gt;An example of the latter point is the definition for &lt;code&gt;list/each&lt;/code&gt; in the current (unpublished) branch with support for ADTs:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;type a list 
  { nil
  | cons : a, a list
  }

def list/each
  [..r, a list, [..r, a -&amp;gt; ..r] -&amp;gt; ..r]
  { list/case: swap
      [drop]
      [swap unbury [unbury drop call] 3keep
       swap drop list/each];
  }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That annotation is required, or else the type inference algorithm gives &lt;code&gt;list/each&lt;/code&gt; a type of &lt;code&gt;[..r, a list, [..r, a -&amp;gt; ⊤] -&amp;gt; ..r]&lt;/code&gt; (where &lt;code&gt;⊤&lt;/code&gt; is the &amp;quot;top&amp;quot; stack).
Since we lose track of the stack returned by the quotation given to &lt;code&gt;list/each&lt;/code&gt;, it can, for example, push values to the stack indiscriminately, and the type inference will have &lt;em&gt;de-synced&lt;/em&gt; from the actual result of the program, and that's no good.&lt;/p&gt;
&lt;p&gt;Of course, the language doesn't really stop us from doing that with the correct annotation, it just returns a weird recursive type of &lt;code&gt;[(..r &amp;amp; μr. (..r, nat &amp;amp; ..r)) -&amp;gt; (..r | μr. (..r, nat | ..r))]&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def main 
  { list/each: {1 2 3 4}
      [];
  }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Whether we should reject words with recursive types or not is a heuristic I haven't touched on yet.  There's also the problem in that the type inference can't infer the types of useful combinators, like &lt;code&gt;bi@&lt;/code&gt;, but I've decided to just ignore them for the meantime.&lt;/p&gt;
&lt;p&gt;So for Growl, the updates are a resounding &amp;quot;meh&amp;quot;, but that's okay.  I'm not like a type theorist, I'm just a guy playing around with their computer.&lt;/p&gt;
&lt;p&gt;I've also been working on an album, titled &lt;em&gt;Dogyears&lt;/em&gt;, but you'll be hearing more about it during the year as I get it done.&lt;/p&gt;
</content><id>https://quiltro.org/blog/first-post/</id><title type="text">Blogging again, and what I've been up to</title><updated>2026-04-29T00:00:00-00:00</updated><author><email>lobo@quiltro.org</email><uri>https://quiltro.org</uri><name>Javier B. Torres</name></author></entry><entry><published>2025-02-01T00:00:00-00:00</published><link href="https://quiltro.org/blog/stop-doing-computers/" rel="self"/><content type="html">&lt;p&gt;Today I looked at my phone (a Motorola Moto G85), and saw six new application
icons on my app drawer. I recognized those icons, they were the same
applications it installed during the first setup I went through when I first got
this phone: various games which I can only assume are ad-ridden and have some
sort of deal with Motorola/Lenovo to get them installed in as many phones as
they can.&lt;/p&gt;
&lt;p&gt;Fortunately, Android provides the user with the ability to see &lt;em&gt;what&lt;/em&gt; installed
an application in their device, and in this case, they were all installed by an
application by the name of &amp;quot;Moto App Manager&amp;quot;.&lt;/p&gt;
&lt;p&gt;If you search for that name you'll get lots of results from places like Reddit,
some blogs or review sites, and even Lenovo's community forums, about what the
app does: installing &amp;quot;helpful suggested apps&amp;quot;.&lt;/p&gt;
&lt;p&gt;For a similar story related to the point I'm about to make, this exact same
phone runs out of memory every week or so for no reason, and until I restart it,
it just... doesn't work correctly. Apps crash for no reason, anything that uses
the fingerprint reader refuses to work, crashing when the dialog is normally
shown, the tap-to-pay functionality doesn't work, nothing works until I hit
restart and wait &lt;em&gt;five whole fucking minutes&lt;/em&gt; or more for the phone to boot up.&lt;/p&gt;
&lt;p&gt;I'm tired of having to jump through hoops to get &amp;quot;solutions&amp;quot; to problems that
shouldn't have even been problems to begin with.&lt;/p&gt;
&lt;p&gt;For example, I posted about this on Mastodon as a rant and one of the responses
I got went along the lines of &amp;quot;oh, you can disable the app for good by getting
into USB debugging mode and sending commands to the phone to freeze the
application.&amp;quot;, and it's ridiculous that I (or anyone else for that matter) should be expected to jump through hoops of that kind just to make my phone just slightly more usable.&lt;/p&gt;
&lt;p&gt;If I told any of my family members that they have to restart their phone every
once in a while otherwise it starts acting up, or that I need to connect their
phone to my computer and send it commands to stop it from installing apps they
never asked for, they'd start wondering whether the phone is malfunctioning or
something like that.&lt;/p&gt;
&lt;p&gt;And that's the problem. Why do I, or anyone who is slightly tech-savvy, have to
cope with tricks and hoops and general fuckery with everything we are forced to
use to make it usable? Why do the rest have to either just &amp;quot;get used to it&amp;quot; or
have to ask for help to make their devices more pleasant to use?&lt;/p&gt;
&lt;p&gt;&amp;quot;Just go to this hidden section in the settings and disable this switch, but
only after 4 dialog boxes asking you if you really want to!&amp;quot;--- &amp;quot;You need to
disable this application by sending commands from your computer so it won't
install shit bloatware that you'll never need!&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Statements dreamed up by the utterly deranged.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We're basically letting abusive practices in technology hold us hostage.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Thanks to my friend Spencer who helped me with proofreading for this post! :)&lt;/p&gt;
</content><id>https://quiltro.org/blog/stop-doing-computers/</id><title type="text">Stop doing computers!</title><updated>2025-02-01T00:00:00-00:00</updated><author><email>lobo@quiltro.org</email><uri>https://quiltro.org</uri><name>Javier B. Torres</name></author></entry><entry><published>2023-11-04T00:00:00-00:00</published><link href="https://quiltro.org/blog/unmaintained/" rel="self"/><content type="html">&lt;p&gt;What happens when a project reaches a point where no new features are needed? Is it really &amp;quot;unmaintained&amp;quot; if there's nothing left to do? Sure, you could add more features, but if the &amp;quot;core&amp;quot; of what you have works, and you've built projects with it, is it really worth it?&lt;/p&gt;
&lt;p&gt;I've been thinking about this for a while now, after I saw a conversation on the &lt;a href=&quot;https://moonscript.org&quot;&gt;MoonScript&lt;/a&gt; Discord guild which went roughly like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A: Are there any plans for type declarations in MoonScript?&lt;br&gt;
B: No, and there'll never be due to MoonScript being unmaintained.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Come to think of it for a moment, the &lt;a href=&quot;https://leafo.net/lapis/&quot;&gt;Lapis&lt;/a&gt; web framework, which is being used in production by &lt;a href=&quot;https://itch.io&quot;&gt;itch.io&lt;/a&gt; and other projects from Leaf, is written in MoonScript (as well as most code &lt;em&gt;using&lt;/em&gt; said framework). Lapis sees new releases regularly (last one being two days ago), so it's safe to say it's not an &amp;quot;unmaintained&amp;quot; project, and a relief, considering it's used in production.&lt;/p&gt;
&lt;p&gt;But this means that, by proxy, MoonScript is &lt;em&gt;also&lt;/em&gt; used in production, so... what gives?&lt;/p&gt;
&lt;p&gt;Nothing, honestly. I wouldn't say MoonScript is dead, since people are clearly writing code with it today, but I also wouldn't say it's unmaintained, even if it hasn't seen a release in roughly 7 years. I'd argue there's different contexts for when a project is &amp;quot;dead&amp;quot;, &amp;quot;alive&amp;quot; or &amp;quot;unmaintained&amp;quot;, and when it comes to compilers (or more specifically transpilers, in the case of MoonScript), I'd say it basically boils down to the status of the target language (and we all know Lua isn't dead.)&lt;/p&gt;
&lt;p&gt;Of course, if it were something like a web framework, or otherwise a project in an area that moves fast, sadly things die fast, but we're not on that level... yet.&lt;/p&gt;
</content><id>https://quiltro.org/blog/unmaintained/</id><title type="text">Unmaintained, dead, or just finished?</title><updated>2023-11-04T00:00:00-00:00</updated><author><email>lobo@quiltro.org</email><uri>https://quiltro.org</uri><name>Javier B. Torres</name></author></entry></feed>