HackerURLs

一次又一次被重新发现的经典。

同一个链接,相隔一年以上,一次又一次被人重新发现、再次冲上 Hacker News 首页。能经受住这种时间检验的,大多是值得一读再读的文章。每篇附中文标题,讨论最热的那些再加上中文导读和高赞评论翻译。

从名人堂开始
  • 4,700+篇经过时间检验的经典

Hall of fame

名人堂

在经典库里看全部精选

上首页次数最多、而且有中文导读的 30 篇。时间轴上每个黑点是一次上首页,空心点是一次没冲上去的投稿。

  1. 正在载入经典…

Archive

经典库

按第一次上首页的年份分布,点柱子筛选。

排序

    About

    这些经典是怎么挑出来的

    1. 01

      合并同一个链接

      读取 Hacker News 自 2006 年以来的全部链接投稿,把 http/https、www、跟踪参数等写法不同的同一篇文章合并成一条。

    2. 02

      只留经得起时间的

      同一链接至少两次拿到 50 分以上(约等于上首页),而且两次相隔一年以上;再由 AI 剔除状态页、产品首页和新闻事件。

    3. 03

      写导读、译评论

      上首页次数最多的 2,000 篇配上中文导读、"为什么经久不衰",并精选翻译 HN 高赞评论。导读由 AI 生成,可能有误。

    编程与软件工程github.com

    为 C 语言引入 Lisp 宏

    Lisp macros for C

    3次上首页
    8年跨度
    304累计得分
    96条评论

    2014 — 2022,它一次次回到首页

    黑点是上首页(≥ 50 分)的那次投稿,空心点是没冲上去的投稿,点越大分数越高。

    导读

    cmacro 是一个为 C 语言实现类 Lisp 宏系统的开源项目,让开发者能在 C 中编写强大的宏来扩展语言。项目作者认为,没有宏的语言只是工具,而有宏的语言则像建筑材料,可以被塑造成你的应用。该项目在 2014、2017 和 2022 年多次登上 Hacker News 首页,引发了关于宏系统本质的深入讨论。

    为什么经久不衰:它触及一个经久不衰的话题:如何把 Lisp 式的元编程能力带进 C 这样的底层语言,每次重提都能引发关于宏系统设计本质的讨论。

    关键词 LispC语言宏元编程

    HN 评论精选

    真正的 Lisp 宏的关键在于宏与普通代码共享同一语言环境,可自由互相调用

    评判任何“宏”系统的好问题是:假设你已用该语言写了一个有用的函数 foo,之后想写宏 bar,你能在写 bar 时使用 foo 吗?如果答案是“不能”,那你就没有真正的类 Lisp 宏。Lisp 宏的强大之处不在于能改写抽象语法树——那用解析器和模板语言也能做到——而在于“写代码”和“写宏”之间没有真正的分界,全都是代码,函数和宏交织在一起共同塑造语言。相比之下,在 ClojureScript 里写宏时,你得时刻考虑某个函数是在 Clojure 世界还是 ClojureScript 世界,需要的话还得移植过去。

    stevelosh查看英文原文

    A good question for any "macro" systems like this is something like the following: 1. Suppose you've written a function 'foo' in your language that does something useful (e.g.: partitions a sequence, validates a map, or pretty much anything really). 2. Some time later you want to write a macro 'bar'. 3. Can you use function 'foo' when writing 'bar'? If the answer to 3 is "no" then you don't really have Lisp-like macros. This is what makes Lisp macros so powerful. It's not just that you have a way to mangle abstract syntax trees. If that's all you want then yeah, you can write a parser and template language to do it, like this thing or sweet js, but it's not the same. Lisp macros are beautiful because there's no real divide between "writing code" and "writing macros". It's all just code. You don't have to worry about which things are available in code-land and which are available in macro-land because they're the same place. There's just "the language" which you extend and mold with functions and macros woven together as necessary. Contrast this with a language without real Lisp-like macros, like Clojurescript. If I want to write the 'bar' macro in Clojurescript I need to think "wait 'foo' is a Clojurescript function so now I need to port it back into Clojure land before I can use it in this macro because macros in Clojurescript live in Clojure-land not Clojurescript-land". I need to think about this for everything I call inside a macro. (Admittedly the situation isn't as bad in Clojurescript because it's fairly close to Clojure in syntax and it's possible to cross-compile code so it lives in both "lands", but the ugly divide is still there.) Common Lisp, Clojure, Scheme, Wisp, Julia, etc have Lisp-like macros. Sweet JS, Clojurescript, C, etc don't.

    推荐 Terra:一个用 Lua 实现类似元编程能力的相关项目

    类似的项目可以看看 Terra,它是“Lua 的底层对应物”,基于 Lua,但拥有通过 LLVM JIT 编译成机器码的底层函数,支持从底层函数调用 Lua 宏,也可以用 Lua 代码编写复杂的高层框架。项目仍在开发中,有些部分还不完善,但非常有意思。

    tomp查看英文原文

    For something similar, take a look at Terra [1], the "low-level counterpart to Lua". It's based on Lua, but has "low-level" functions that are JIT-compiled to machine code using LLVM. It supports calling Lua macros from low-level functions, or you can use Lua code to write complex high-level frameworks (e.g. Go-like object system [2], Java-like object system [3]). It's still in development, so there are parts of the system that don't work very well (e.g. global variables in compiled executables cannot be statically initialized), but it's a very interesting project. [1] http://terralang.org/ [2] https://github.com/zdevito/terra/blob/master/tests/lib/golike.t [3] https://github.com/zdevito/terra/blob/master/tests/lib/javalike.t

    能否集成 Clang 工具链是决定其实用性的关键

    如果能把它集成进 Clang 流水线,让基于 Clang 的自动补全和错误检测能正确处理宏展开后的源码,就能轻松融入现有项目工作流。否则由于缺乏工具链支持,可用性会受限。Clang 已经对 C 预处理器做了这件事,不过那可能容易得多,因为预处理器不是图灵完备的。

    terhechte查看英文原文

    It would be great to be able to integrate this into the Clang pipeline so that Clang based auto completion and error detection would not trip over it but correctly evaluate the resulting source and use that. Then, it would be easy to integrate this into an existing project workflow. Otherwise it would limit usability due to a lack in tooling support, I'd guess. Clang already does that for the C preprocessor, although that is probably much easier to do since it is not Turing complete [1] [1] By definition. Though some people throw crazy things at it: http://stackoverflow.com/questions/3136686/is-the-c99-preprocessor-turing-complete

    宏能给 C 带来便利,但也担心可读性,Nim 或许是更好的选择

    这是给 C 注入新生命力的有趣方式,我已经能想到几个强大宏能派上用场、消除痛点的地方。但另一方面,我不确定是否想读别人写的、混杂着高层构造的底层代码。也许 Nim 更适合这个目的?

    veli_joza查看英文原文

    This is very interesting way to breathe new life into C. I can already think of few places where powerful macros would come in handy and eliminate some pains. On the other hand, I'm not sure if I'd want to read other people's low-level code sprinkled with high-level constructs. Perhaps Nim would serve this purpose better?

    历次讨论

    同类还值得读

    1. 开源应用架构

      The Architecture of Open Source Applications

      《开源软件架构》(AOSA)是一本在线免费书,邀请知名开源项目的作者亲自剖析其内部设计,涵盖 SQLAlchemy、LLVM、Audacity、Apache、Bash 等系统。

      编程与软件工程上首页 9 次 · 2011–2024aosabook.org编辑精选
    2. 编程语言简史:简短、不完整且多半错误

      A Brief, Incomplete, and Mostly Wrong History of Programming Languages

      一篇以戏谑、故意不准确的方式回顾编程语言史的博客文章,用夸张轶事和讽刺定义串起 Lisp、C、C++、Java、JavaScript、PHP 等语言。

      编程与软件工程上首页 8 次 · 2009–2021james-iry.blogspot.com
    3. SQLite 是如何测试的

      How SQLite is tested

      SQLite 官方文档页,系统介绍 SQLite 的测试体系:多种测试方法(TCL 测试、模糊测试、回归测试、静态分析等)和海量测试用例,展示了这个小型开源项目如何靠极致测试获得…

      编程与软件工程上首页 8 次 · 2009–2025sqlite.org编辑精选
    4. 高级编程语言(2009)

      Advanced programming languages (2009)

      Matt Might 的经典文章,按用途推荐“高级编程语言”:如果追求就业就选主流语言,如果追求表达力、学术研究或创业,则推荐 Haskell、OCaml、Scala 等函数式语…

      编程与软件工程上首页 8 次 · 2009–2022matt.might.net
    5. 我的 Forth 与栈机器经历

      Yosefk - My history with Forth & stack machines

      作者以亲身经历回顾了使用 Forth 语言和栈式机器的历程:既赞叹其简洁优雅、代码量小、可自举的优点,也坦率指出栈操作在实际编程中的痛苦,以及 Forth 社区文化中的问题。

      编程与软件工程上首页 8 次 · 2010–2024yosefk.com编辑精选

    打赏支持

    打赏二维码

    觉得有用,请作者喝杯咖啡。

    WeChat

    关注向阳乔木

    微信公众号「向阳乔木推荐看」

    微信公众号「向阳乔木推荐看」二维码

    微信扫一扫;在微信里打开本页时,长按二维码识别。