<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: andreypopp</title><link>https://news.ycombinator.com/user?id=andreypopp</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Tue, 16 Jun 2026 06:20:32 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=andreypopp" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by andreypopp in "I love my Bluetooth keyboard"]]></title><description><![CDATA[
<p>Cmd+Tab works on iOS on iPad, when keyboard is connected, not sure about iPhones</p>
]]></description><pubDate>Mon, 25 May 2026 09:53:32 +0000</pubDate><link>https://news.ycombinator.com/item?id=48265126</link><dc:creator>andreypopp</dc:creator><comments>https://news.ycombinator.com/item?id=48265126</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48265126</guid></item><item><title><![CDATA[New comment by andreypopp in "I prefer human-readable file formats"]]></title><description><![CDATA[
<p>try clickhouse-local, it's amazing how it can crunch JSON/TSV or whatever at great speed</p>
]]></description><pubDate>Sat, 09 Aug 2025 12:46:59 +0000</pubDate><link>https://news.ycombinator.com/item?id=44846091</link><dc:creator>andreypopp</dc:creator><comments>https://news.ycombinator.com/item?id=44846091</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44846091</guid></item><item><title><![CDATA[New comment by andreypopp in "Teal – A statically-typed dialect of Lua"]]></title><description><![CDATA[
<p>> this also seems a way to declare types for your own code in an external file, thus keeping your code as runnable Lua and benefiting from type checking too<p>The declaration file isn't used to typecheck the code the declaration is for. It is only for consumers of the code.</p>
]]></description><pubDate>Fri, 16 May 2025 09:59:46 +0000</pubDate><link>https://news.ycombinator.com/item?id=44003539</link><dc:creator>andreypopp</dc:creator><comments>https://news.ycombinator.com/item?id=44003539</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44003539</guid></item><item><title><![CDATA[New comment by andreypopp in "Argdown, like Markdown for argument mapping"]]></title><description><![CDATA[
<p>checkout <a href="http://docopt.org" rel="nofollow">http://docopt.org</a> then</p>
]]></description><pubDate>Thu, 08 Aug 2024 06:19:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=41188632</link><dc:creator>andreypopp</dc:creator><comments>https://news.ycombinator.com/item?id=41188632</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41188632</guid></item><item><title><![CDATA[New comment by andreypopp in "Melange 2.0: Compile OCaml / ReasonML to JavaScript"]]></title><description><![CDATA[
<p>Would be interesting to know what’s the plan regarding supporting effects in melange. IIRC jsoo (the another OCaml to JS compiler) is doing some whole program analysis to compile to efficient CPS.</p>
]]></description><pubDate>Wed, 20 Sep 2023 05:02:07 +0000</pubDate><link>https://news.ycombinator.com/item?id=37580535</link><dc:creator>andreypopp</dc:creator><comments>https://news.ycombinator.com/item?id=37580535</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=37580535</guid></item><item><title><![CDATA[New comment by andreypopp in "Dart 3.1 and a retrospective on functional style programming in Dart"]]></title><description><![CDATA[
<p>Does it (Dart, C#) support exhaustivity checking for such matching over subclasses?</p>
]]></description><pubDate>Thu, 17 Aug 2023 17:05:47 +0000</pubDate><link>https://news.ycombinator.com/item?id=37164843</link><dc:creator>andreypopp</dc:creator><comments>https://news.ycombinator.com/item?id=37164843</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=37164843</guid></item><item><title><![CDATA[New comment by andreypopp in "Using command line to process CSV files (2022)"]]></title><description><![CDATA[
<p>Agreed here, it's impressive how easy it is to use and how performant it is.<p>Would be nice to add a seamless ability to call executable UDFs from clickhouse-local, last time I checked clickhouse-local required executables to be in a special directory (as in proper clickhouse). Instead it'd be nice to be able to reference any executable in an ad-hoc way.</p>
]]></description><pubDate>Wed, 28 Jun 2023 05:27:31 +0000</pubDate><link>https://news.ycombinator.com/item?id=36502640</link><dc:creator>andreypopp</dc:creator><comments>https://news.ycombinator.com/item?id=36502640</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=36502640</guid></item><item><title><![CDATA[New comment by andreypopp in "Show HN: ScrapScript – A tiny functional language for sharable software"]]></title><description><![CDATA[
<p>OCaml has a similar thing but purely on syntactic level — <a href="http://jobjo.github.io//2019/04/24/ocaml-has-some-new-shiny-syntax.html" rel="nofollow">http://jobjo.github.io//2019/04/24/ocaml-has-some-new-shiny-...</a></p>
]]></description><pubDate>Fri, 28 Apr 2023 10:54:06 +0000</pubDate><link>https://news.ycombinator.com/item?id=35739681</link><dc:creator>andreypopp</dc:creator><comments>https://news.ycombinator.com/item?id=35739681</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=35739681</guid></item><item><title><![CDATA[New comment by andreypopp in "BQN: Finally, an APL for your flying saucer"]]></title><description><![CDATA[
<p>BQN brings back joy of programming for me — I was using it for Advent Of Code 2021 and it was so much fun.<p>Also check out BQNPAD[1], the online BQN REPL built with codemirror (syntax highlighting, history).<p>[1]: <a href="https://bqnpad.mechanize.systems" rel="nofollow">https://bqnpad.mechanize.systems</a></p>
]]></description><pubDate>Thu, 13 Oct 2022 09:16:12 +0000</pubDate><link>https://news.ycombinator.com/item?id=33188879</link><dc:creator>andreypopp</dc:creator><comments>https://news.ycombinator.com/item?id=33188879</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=33188879</guid></item><item><title><![CDATA[New comment by andreypopp in "SpaceVim 2.0"]]></title><description><![CDATA[
<p>To be honest it seems vim/neovim ticks all those points already.</p>
]]></description><pubDate>Thu, 07 Jul 2022 07:22:36 +0000</pubDate><link>https://news.ycombinator.com/item?id=32010867</link><dc:creator>andreypopp</dc:creator><comments>https://news.ycombinator.com/item?id=32010867</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=32010867</guid></item><item><title><![CDATA[New comment by andreypopp in "CodeMirror 6.0 Stable Release"]]></title><description><![CDATA[
<p>CodeMirror 6 is an awesome piece of software and very flexible — I was even able to build a notebook UI with it — <a href="https://bqnpad.mechanize.systems/notebook" rel="nofollow">https://bqnpad.mechanize.systems/notebook</a> — this is a notebook (WIP) for BQN[1].<p>The nice thing is that the whole notebook is a single CodeMirror editor with cells stored as ranges in CodeMirror state. This way intercell actions like selection/copy/paste are possible and still you can control execution per cell.<p>Shortcuts at <a href="https://bqnpad.mechanize.systems/notebook" rel="nofollow">https://bqnpad.mechanize.systems/notebook</a><p>* Shift+Enter to eval cell<p>* Cmd-Enter to create new cell<p>* Cmd-Option-Enter to split cell at cursor<p>* Cmd-Backspace to join cell with the previous one<p>[1]: <a href="https://mlochbaum.github.io/BQN/index.html" rel="nofollow">https://mlochbaum.github.io/BQN/index.html</a></p>
]]></description><pubDate>Wed, 08 Jun 2022 14:11:04 +0000</pubDate><link>https://news.ycombinator.com/item?id=31667615</link><dc:creator>andreypopp</dc:creator><comments>https://news.ycombinator.com/item?id=31667615</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=31667615</guid></item><item><title><![CDATA[New comment by andreypopp in "K – A simple, fast vector programming language"]]></title><description><![CDATA[
<p>It's very cool to see ngn/k on the HN front page.<p>After the recent AoC which I've attempted to solve with BQN[1] (another array language) I've got interested in array languages and now exploring K too.<p>K seems like a nice blend between an array language and a lisp: list is a primary data structure in K, no multidimensional data. K is good at symbolic workloads as well — visit <a href="http://nsl.com" rel="nofollow">http://nsl.com</a> for some examples.<p>Also, make sure to check out the C code style ngn/k is written with :-) another K implementation Kona (uses similar C code style) has a wiki page with explanation[2].<p>[1]: <a href="https://mlochbaum.github.io/BQN/index.html" rel="nofollow">https://mlochbaum.github.io/BQN/index.html</a>
[2]: <a href="https://github.com/kevinlawler/kona/wiki/Coding-Guidelines" rel="nofollow">https://github.com/kevinlawler/kona/wiki/Coding-Guidelines</a></p>
]]></description><pubDate>Fri, 13 May 2022 00:05:04 +0000</pubDate><link>https://news.ycombinator.com/item?id=31361593</link><dc:creator>andreypopp</dc:creator><comments>https://news.ycombinator.com/item?id=31361593</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=31361593</guid></item><item><title><![CDATA[New comment by andreypopp in "GraphQL is now available on Supabase"]]></title><description><![CDATA[
<p>It's impressive that the entire thing is in pl/pgsql (apart from parsing).<p>Have you considered any other implementation strategies (C native extension, any other pl/* or maybe running an out of PostgreSQL process which does GraphQL to SQL compilation)?</p>
]]></description><pubDate>Wed, 30 Mar 2022 09:02:10 +0000</pubDate><link>https://news.ycombinator.com/item?id=30852893</link><dc:creator>andreypopp</dc:creator><comments>https://news.ycombinator.com/item?id=30852893</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=30852893</guid></item><item><title><![CDATA[New comment by andreypopp in "Microsoft YARP"]]></title><description><![CDATA[
<p>Lua in nginx can you get very far in my experience.</p>
]]></description><pubDate>Sun, 20 Feb 2022 22:59:30 +0000</pubDate><link>https://news.ycombinator.com/item?id=30410088</link><dc:creator>andreypopp</dc:creator><comments>https://news.ycombinator.com/item?id=30410088</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=30410088</guid></item><item><title><![CDATA[New comment by andreypopp in "2021 at OCamlPro"]]></title><description><![CDATA[
<p>> What’s wrong with opam?<p>I'd say the main problem is that local switches and lock files are still not the default mode of operation.<p>Also opam lacks a global cache of built packages which esy provides (esy's cache is modelled after Nix package manager). So every new opam local switch effectively compiles everything from scratch. Though, as I understand this aspect is going to be addressed by dune at some point (though esy caches not just OCaml built artefacts but also C/C++).<p>(Full disclosure: I'm biased as I'm one of the original developers of esy)</p>
]]></description><pubDate>Fri, 18 Feb 2022 22:25:29 +0000</pubDate><link>https://news.ycombinator.com/item?id=30391948</link><dc:creator>andreypopp</dc:creator><comments>https://news.ycombinator.com/item?id=30391948</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=30391948</guid></item><item><title><![CDATA[New comment by andreypopp in "I’m porting the TypeScript type checker tsc to Go"]]></title><description><![CDATA[
<p>Specification isn't being followed is of course useless. But yeah, tests are definitely useless and in the absence of the spec is the only sane way to approach such rewrite.</p>
]]></description><pubDate>Tue, 25 Jan 2022 21:09:12 +0000</pubDate><link>https://news.ycombinator.com/item?id=30078055</link><dc:creator>andreypopp</dc:creator><comments>https://news.ycombinator.com/item?id=30078055</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=30078055</guid></item><item><title><![CDATA[New comment by andreypopp in "I’m porting the TypeScript type checker tsc to Go"]]></title><description><![CDATA[
<p>Well... How many paid work hours spent on tsc? Then does TypeScript have a formal language specification? I'm pessimistic it's possible to rewrite tsc with full compat (bug-to-bug, otherwise it doesn't really make much sense) without MS support... but who knows... I'd like fast compiles too, so good luck!</p>
]]></description><pubDate>Tue, 25 Jan 2022 18:55:38 +0000</pubDate><link>https://news.ycombinator.com/item?id=30076254</link><dc:creator>andreypopp</dc:creator><comments>https://news.ycombinator.com/item?id=30076254</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=30076254</guid></item><item><title><![CDATA[New comment by andreypopp in "FunSQL.jl – Julia library for compositional construction of SQL queries"]]></title><description><![CDATA[
<p>Given the recent posts about compile-to-SQL languages, I thought I'd post here a
link to FunSQL.jl which is another interesting point in the design space and
which, I think, has quite a few really useful design decisions.<p>The library presents an API of combinators for query construction but it's
totally possible to build a concrete syntax around it (in fact I did it for my
port in OCaml). But syntax isn't really this important (it is of course) but the
compositional semantics FunSQL.jl provides:<p>1. Query combinators can be composed together in any order (if they are
"compatible") unlike SQL where structure SELECT .. FROM .. WHERE .. is rigid:<p><pre><code>    from users
    where is_active
    select username
</code></pre>
(also `from` being the first combinator makes code completion much powerful).<p>2. The way FunSQL.jl treats `group by` as just another kind of namespace,
aggregates are then specified as just expressions under this namespace:<p><pre><code>    from users as u
    join (from comments group by user_id) as c on c.user_id = u.id
    select
      u.username,
      c.count() as comment_count,
      c.max(created_date) as comment_last_created_date
</code></pre>
In the example above the `c` subrelation is grouped by `user_id` but it doesn't
specify any aggregates - they are specified in the `select` below so you have
all selection logic co-located in a single place.<p>This is a really useful feature, from my point of view, as it's allows you to
construct re-usable query fragments first and then combine them to build
complete quries.<p>3. In other aspects FunSQL.jl is really close to SQL which I think is a big
plus as well — familiriaty.</p>
]]></description><pubDate>Tue, 25 Jan 2022 15:24:16 +0000</pubDate><link>https://news.ycombinator.com/item?id=30072789</link><dc:creator>andreypopp</dc:creator><comments>https://news.ycombinator.com/item?id=30072789</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=30072789</guid></item><item><title><![CDATA[FunSQL.jl – Julia library for compositional construction of SQL queries]]></title><description><![CDATA[
<p>Article URL: <a href="https://github.com/MechanicalRabbit/FunSQL.jl">https://github.com/MechanicalRabbit/FunSQL.jl</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=30072608">https://news.ycombinator.com/item?id=30072608</a></p>
<p>Points: 25</p>
<p># Comments: 1</p>
]]></description><pubDate>Tue, 25 Jan 2022 15:10:40 +0000</pubDate><link>https://github.com/MechanicalRabbit/FunSQL.jl</link><dc:creator>andreypopp</dc:creator><comments>https://news.ycombinator.com/item?id=30072608</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=30072608</guid></item><item><title><![CDATA[New comment by andreypopp in "PRQL – A proposal for a better SQL"]]></title><description><![CDATA[
<p>FunSQL.jl requires Julia to run (obviously as it is a Julia library) but it
produces standard SQL so Julia in this case is just an implementation language.<p>I have re-implemented parts of FunSQL in Python and OCaml (the one I have ended
up using) and have added a concrete syntax similar to what you have in PRQL.<p><pre><code>    from employees
    define
      salary + payroll_tax as gross_salary,
      gross_salary + benefits_cost as gross_cost
    where gross_cost > 0 and country = 'usa'
    group by title, country
    select
      title,
      country,
      avg(salary) as average_salary,
      sum(salary) as sum_salary,
      avg(gross_salary) as average_gross_salary,
      sum(gross_salary) as sum_gross_salary,
      avg(gross_cost) as average_gross_cost,
      sum(gross_cost) as sum_gross_cost,
      count() as count
    order by sum_gross_cost
    where count > 200
    limit 20
</code></pre>
But, in my mind, the biggest difference between PRQL and FunSQL is the way
FunSQL treats relations with `GROUP BY` - as just another kind of namespaces,
allowing to defer specifying aggregates. A basic example:<p><pre><code>    from users as u
    join (from comments group by user_id) as c on c.user_id = u.id
    select
      u.username,
      c.count() as comment_count,
      c.max(created_date) as comment_last_created_date
</code></pre>
The `c` subrelation is grouped by `user_id` but it doesn't specify any
aggregates - they are specified in the `select` below so you have all selection
logic co-located in a single place.<p>I think this approach is very powerful as it allows you to build reusable query
fragments in isolation but then combine them into a single query which fully
specifies what's being selected.</p>
]]></description><pubDate>Tue, 25 Jan 2022 06:28:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=30068823</link><dc:creator>andreypopp</dc:creator><comments>https://news.ycombinator.com/item?id=30068823</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=30068823</guid></item></channel></rss>