<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: siknad</title><link>https://news.ycombinator.com/user?id=siknad</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Tue, 16 Jun 2026 20:54:05 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=siknad" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by siknad in "Why I Program in Lisp"]]></title><description><![CDATA[
<p>Alternatively, the Writer can be replaced with "IO", then the messages would be printed during the processing.<p>The computation code becomes effectful, but the effects are visible in types and are limited by them, and effects can be implemented both with pure and impure code (e.g. using another effect).<p>The effect can also be abstract, making the processing code kinda pure.<p>In a language with unrestricted side effects you can do the same by passing a Writer object to the function. In pure languages the difference is that the object can't be changed <i>observably</i>. So instead its operations return a new one. Conceptually IO is the same with the object being "world", so computation of type "IO Int" is "World -> (World, Int)". Obviously, the actual IO type is opaque to prevent non-linear use of the world (or you can make the world cloneable). In an impure language you can also perform side-effects, it is similar to having a global singleton effect. A pure language doesn't have that, and requires explicit passing.</p>
]]></description><pubDate>Sat, 12 Apr 2025 16:58:53 +0000</pubDate><link>https://news.ycombinator.com/item?id=43666097</link><dc:creator>siknad</dc:creator><comments>https://news.ycombinator.com/item?id=43666097</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43666097</guid></item><item><title><![CDATA[New comment by siknad in "Why F#?"]]></title><description><![CDATA[
<p>New mainstream languages are rarer than new better (in some way that can be favorable) languages.</p>
]]></description><pubDate>Tue, 01 Apr 2025 15:56:37 +0000</pubDate><link>https://news.ycombinator.com/item?id=43548314</link><dc:creator>siknad</dc:creator><comments>https://news.ycombinator.com/item?id=43548314</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43548314</guid></item><item><title><![CDATA[New comment by siknad in "From Languages to Language Sets"]]></title><description><![CDATA[
<p>Perhaps together with Agda (compiles to Haskell, has FFI to it, is more higher-level), some not-pure ML, and maybe Rust or ATS?</p>
]]></description><pubDate>Mon, 17 Mar 2025 09:32:51 +0000</pubDate><link>https://news.ycombinator.com/item?id=43386601</link><dc:creator>siknad</dc:creator><comments>https://news.ycombinator.com/item?id=43386601</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43386601</guid></item><item><title><![CDATA[New comment by siknad in "Nvidia Security Team: “What if we just stopped using C?” (2022)"]]></title><description><![CDATA[
<p>Maybe better performance can be achieved with specialized models. There are some that were able to solve mathematical olympiad problems, e.g. AlphaProof.</p>
]]></description><pubDate>Fri, 14 Feb 2025 17:27:41 +0000</pubDate><link>https://news.ycombinator.com/item?id=43050688</link><dc:creator>siknad</dc:creator><comments>https://news.ycombinator.com/item?id=43050688</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43050688</guid></item><item><title><![CDATA[New comment by siknad in "Context should go away for Go 2 (2017)"]]></title><description><![CDATA[
<p>We could make explicit effect (context, error) declarations for public functions and inferred for private functions. Explicit enumeration of possible exceptions is required for stable APIs anyway.</p>
]]></description><pubDate>Tue, 21 Jan 2025 14:14:29 +0000</pubDate><link>https://news.ycombinator.com/item?id=42780262</link><dc:creator>siknad</dc:creator><comments>https://news.ycombinator.com/item?id=42780262</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42780262</guid></item><item><title><![CDATA[New comment by siknad in "Context should go away for Go 2 (2017)"]]></title><description><![CDATA[
<p>> against the principles behind statically-typed languages, which all hate implicit things<p>But many statically typed languages allow throwing exceptions of any type. Contexts can be similar: "try catch" becomes "with value", "throw" becomes "get".</p>
]]></description><pubDate>Tue, 21 Jan 2025 12:59:44 +0000</pubDate><link>https://news.ycombinator.com/item?id=42779618</link><dc:creator>siknad</dc:creator><comments>https://news.ycombinator.com/item?id=42779618</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42779618</guid></item><item><title><![CDATA[New comment by siknad in "Why I Chose Common Lisp"]]></title><description><![CDATA[
<p>VS Code support for Common Lisp is lacking. Alive extension is relatively recent and is a solo effort and thus has significant bugs and is not as feature packed as Vim/Emacs alternatives. For example, it doesn't provide structural editing. It's interaction with sbcl cache seemingly broke my project a few times.</p>
]]></description><pubDate>Sun, 12 Jan 2025 10:02:18 +0000</pubDate><link>https://news.ycombinator.com/item?id=42672458</link><dc:creator>siknad</dc:creator><comments>https://news.ycombinator.com/item?id=42672458</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42672458</guid></item><item><title><![CDATA[New comment by siknad in "Game dev in Rust: a year later"]]></title><description><![CDATA[
<p>> Regarding pattern-matching and enum types, I can see why a C++ programmer is impressed with such constructs, but it's really underwhelming for an OCaml/Haskell programmer.<p>What's underwhelming about Rust's enums and pattern matching? Lacking indexed types/GADTs?<p>> I even wonder if it's necessarily a better choice than modern C++ for someone starting a new project.<p>The same enums, matching and other language features that aren't related to safety and yet allow the developer to write less boilerplate, alleviate the need to remember implementation details of the code used. And as someone said here, safety is not only about security vulnerabilities.<p>Not once I had problems with the borrow checker. Maybe it depends on the domain, requirements or project size. While I haven't finished any game in Rust, I am writing one (as a hobby/learning) and I try to avoid unnecessary and noticeable performance hits. Though I am working under the assumption that some runtime checks that are present in safe Rust and not in C++ are a net positive due to easier debugging. I'm not convinced that "unsafe" code and asm are necessary in modern gamedev.</p>
]]></description><pubDate>Sun, 05 Jan 2025 12:36:35 +0000</pubDate><link>https://news.ycombinator.com/item?id=42601375</link><dc:creator>siknad</dc:creator><comments>https://news.ycombinator.com/item?id=42601375</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42601375</guid></item><item><title><![CDATA[New comment by siknad in "Game dev in Rust: a year later"]]></title><description><![CDATA[
<p>Bevy has support for dynamically described components and systems. Their main use-case is scripting language support. Can't agree that they <i>insist</i> on single language approach.</p>
]]></description><pubDate>Sun, 05 Jan 2025 12:06:28 +0000</pubDate><link>https://news.ycombinator.com/item?id=42601248</link><dc:creator>siknad</dc:creator><comments>https://news.ycombinator.com/item?id=42601248</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42601248</guid></item><item><title><![CDATA[New comment by siknad in "Why is Common Lisp not the most popular programming language?"]]></title><description><![CDATA[
<p>> Lack of access to the C libraries.<p>Isn't CFFI enough for that?</p>
]]></description><pubDate>Thu, 15 Feb 2024 00:56:54 +0000</pubDate><link>https://news.ycombinator.com/item?id=39377786</link><dc:creator>siknad</dc:creator><comments>https://news.ycombinator.com/item?id=39377786</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=39377786</guid></item><item><title><![CDATA[New comment by siknad in "Why is Common Lisp not the most popular programming language?"]]></title><description><![CDATA[
<p>> There is nothing compelling about the language to people who aren't already Lisp people.<p>CL is expression based (like Rust, unlike other mainstream languages I've seen), has a concise macro system (more convenient than Rust's imo), has  a GC (simpler to use than languages with manual memory management or RC-only), has a better developed ecosystem then some new languages (ex. automatic ffi generation; while buggy, tremendously helpful compared to writing bindings manually). And it's not pure as in Haskell. And it has type annotations that may be checked at runtime or improve performance. An implementation like SICL could make it viable to use it as a scripting language.<p>Any similar modern languages with better tooling/ecosystem? Perhaps Julia, haven't seen it yet.</p>
]]></description><pubDate>Thu, 15 Feb 2024 00:39:16 +0000</pubDate><link>https://news.ycombinator.com/item?id=39377642</link><dc:creator>siknad</dc:creator><comments>https://news.ycombinator.com/item?id=39377642</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=39377642</guid></item><item><title><![CDATA[New comment by siknad in "The deep link equating math proofs and computer programs"]]></title><description><![CDATA[
<p>I would recommend trying Lean4 because I think it is better suited to programming. Lean has Rust-like toolchain manager; a build system (cf. `.agda-lib`); much more developed tactics (including `termination_by`/`decreasing_by`); more libraries (mathlib, and some experimental programming-oriented libraries for sockets, web, games, unicode...); common use of typeclasses in stdlib/mathlib; `unsafe` per declaration (cf. per module in Agda); sound opaque functions (which must have a nonempty return type) used for `partial` and ffi; "unchained" do-notation (early `return`, imperative loops with `break`/`continue`, `let mut`); easier (more powerful?) metaprogramming and syntax extensions. And in Agda you can't even use Haskell's type constructors with type classes (ex. monad polymorphic fns, and that makes it more difficult to make bindings to Hs libs, than to C libs in Lean).<p>There are features in Agda/Idris (and probably Coq, about which I sadly know almost nothing) that are absent from Lean and are useful when programming (coinduction, set omega, more powerful `mutual`, explicit multiplicity, cubical? etc), but I'd say the need for them is less common.</p>
]]></description><pubDate>Thu, 12 Oct 2023 11:09:18 +0000</pubDate><link>https://news.ycombinator.com/item?id=37855657</link><dc:creator>siknad</dc:creator><comments>https://news.ycombinator.com/item?id=37855657</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=37855657</guid></item><item><title><![CDATA[New comment by siknad in "Lean 4.0"]]></title><description><![CDATA[
<p>How can the audience of a general-purpose programming language not be "programmers"?</p>
]]></description><pubDate>Fri, 08 Sep 2023 16:12:16 +0000</pubDate><link>https://news.ycombinator.com/item?id=37435534</link><dc:creator>siknad</dc:creator><comments>https://news.ycombinator.com/item?id=37435534</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=37435534</guid></item><item><title><![CDATA[New comment by siknad in "Functional Programming in Lean"]]></title><description><![CDATA[
<p>Lean4 is intended to be both, while Idris is more on the programming side and Agda - one the proof side. Maybe I'm mistaken about Idris, but Agda really doesn't prioritize programming: library handling, ffi, and tooling are all rudimentary.</p>
]]></description><pubDate>Mon, 29 May 2023 11:15:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=36112835</link><dc:creator>siknad</dc:creator><comments>https://news.ycombinator.com/item?id=36112835</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=36112835</guid></item><item><title><![CDATA[New comment by siknad in "Functional Programming in Lean"]]></title><description><![CDATA[
<p>Lean is currently moving to the 4th iteration which is the first intended to be a general-purpose programming language. It "is currently being released as milestone releases towards a first stable release". For now the main goal is to port mathlib to the new version, and then they will concentrate on the compiler. So it is not production ready. But that doesn't mean it is not suitable for building any programs now. There is a simple raytracer written in Lean [1]. I have built a chip8 interpreter with it and the only problem was the lack of an ecosystem, meaning I had to build the necessary libraries myself.<p>Now it has a RC GC and boxes everything >= 64 bits (including struct fields and IO/ST results), and as the compiler isn't polished it is probably significantly slower. In the referenced raytracer repo you can find rendering time compared to the C implementation (Lean is 25x slower, but that was a year ago).<p>[1] <a href="https://github.com/kmill/lean4-raytracer">https://github.com/kmill/lean4-raytracer</a></p>
]]></description><pubDate>Mon, 29 May 2023 09:38:41 +0000</pubDate><link>https://news.ycombinator.com/item?id=36112295</link><dc:creator>siknad</dc:creator><comments>https://news.ycombinator.com/item?id=36112295</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=36112295</guid></item><item><title><![CDATA[New comment by siknad in "Functional Programming in Lean"]]></title><description><![CDATA[
<p>Big:<p>* tactics (proof scripts are a lot easier than manual proving)<p>* syntax extensibility (Racket-like, supports custom elaboration/delaboration)<p>* mathlib (library of formalized math)<p>* tooling (can't say it's better, I haven't used Idris, but it's at least a lot nicer than Agda's: rustup-like version manager `elan`, own build system `lake`, official vscode extension supporting mini web apps which can interact with the code)<p>Small things I can remember:<p>* do-notation with early return and imperative loops<p>* easier termination proof handling (provide some expression using function arguments with `decreasing_by` and prove it's decreasing with `termination_by` block, which may be automatic even for non-structural recursion because of some built-in tactic)</p>
]]></description><pubDate>Mon, 29 May 2023 09:20:03 +0000</pubDate><link>https://news.ycombinator.com/item?id=36112207</link><dc:creator>siknad</dc:creator><comments>https://news.ycombinator.com/item?id=36112207</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=36112207</guid></item><item><title><![CDATA[New comment by siknad in "All I want for Christmas is these seven TypeScript improvements"]]></title><description><![CDATA[
<p>> that can accept any number of functions<p>So, `(a -> b) -> (b -> c) -> (c -> d) -> ... -> a -> z`.</p>
]]></description><pubDate>Mon, 26 Dec 2022 09:50:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=34136203</link><dc:creator>siknad</dc:creator><comments>https://news.ycombinator.com/item?id=34136203</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=34136203</guid></item><item><title><![CDATA[New comment by siknad in "Mathematical Existence and the Axiom of Choice"]]></title><description><![CDATA[
<p>I've seen an advice to not use equality on floats, and instead use something like |x-y|<e. Probably translates to constructive reals as it needs to compute only some part of the numbers.</p>
]]></description><pubDate>Tue, 29 Nov 2022 18:29:51 +0000</pubDate><link>https://news.ycombinator.com/item?id=33791269</link><dc:creator>siknad</dc:creator><comments>https://news.ycombinator.com/item?id=33791269</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=33791269</guid></item><item><title><![CDATA[New comment by siknad in "Three new utility functions in C++23"]]></title><description><![CDATA[
<p>Reversing bytes sounds like reversing their bit orders to me.</p>
]]></description><pubDate>Wed, 09 Nov 2022 12:39:31 +0000</pubDate><link>https://news.ycombinator.com/item?id=33530694</link><dc:creator>siknad</dc:creator><comments>https://news.ycombinator.com/item?id=33530694</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=33530694</guid></item><item><title><![CDATA[New comment by siknad in "Functional programming should be the future of software"]]></title><description><![CDATA[
<p>> I kept waiting for more examples for why we need FP<p>Dependent types, allow a lot more type safety (ex. shader program type parametrized by description of its uniform variables, getting rid of `INVALID_OPERATION` on wrong uniform location/type).<p>> you can incorporate those features in imperative languages like Rust and Swift<p>Incorporating dependent types into imperative languages with unrestricted effects is hard (impossible?).</p>
]]></description><pubDate>Wed, 02 Nov 2022 18:38:57 +0000</pubDate><link>https://news.ycombinator.com/item?id=33440833</link><dc:creator>siknad</dc:creator><comments>https://news.ycombinator.com/item?id=33440833</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=33440833</guid></item></channel></rss>