惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Simon Willison's Weblog
Simon Willison's Weblog
P
Privacy International News Feed
www.infosecurity-magazine.com
www.infosecurity-magazine.com
T
Troy Hunt's Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
Attack and Defense Labs
Attack and Defense Labs
S
Secure Thoughts
V2EX - 技术
V2EX - 技术
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
O
OpenAI News
Cloudbric
Cloudbric
Google Online Security Blog
Google Online Security Blog
Schneier on Security
Schneier on Security
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Help Net Security
Help Net Security
Cyberwarzone
Cyberwarzone
G
GRAHAM CLULEY
L
Lohrmann on Cybersecurity
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Spread Privacy
Spread Privacy
NISL@THU
NISL@THU
N
News and Events Feed by Topic
T
Tenable Blog
S
Security @ Cisco Blogs
N
News and Events Feed by Topic
The Hacker News
The Hacker News
C
CXSECURITY Database RSS Feed - CXSecurity.com
宝玉的分享
宝玉的分享
月光博客
月光博客
酷 壳 – CoolShell
酷 壳 – CoolShell
美团技术团队
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google DeepMind News
Google DeepMind News
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog
V
Visual Studio Blog
P
Proofpoint News Feed
Webroot Blog
Webroot Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 三生石上(FineUI控件)
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Jina AI
Jina AI
雷峰网
雷峰网
T
The Blog of Author Tim Ferriss
Hugging Face - Blog
Hugging Face - Blog
腾讯CDC
L
LangChain Blog
The Register - Security
The Register - Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 聂微东

weirane’s blog

开始读《异见时刻》 中美文化差异 使用 bwrap 隔离 WPS Office 从零开始的 λ 演算 从 Manjaro 迁移到 Arch Linux 使用 pass 管理密码 更换域名 搭建一个 Git 服务器 Fcitx5 安装记
关于基于表达式的编程语言的一些思考
weirane · 2021-12-25 · via weirane’s blog

关于基于表达式的编程语言的一些思考

3 minute read

最近学 Go 语言又想起之前看过的一个 talk,presenter 说他几乎不用 else 关键字。因为一般情况下,if 语句的其中一个 branch 会比较短(比如处理特殊情况),这样可以在这个 branch 结束后直接从函数返回,后续的代码就不需要进行缩进了,如

func fact(n int) int {
    if n <= 1 {
        return 1
    }
    // no extra indent here!
    return fact(n - 1) * n
}

可以减少缩进当然是件好事。如果后续代码很长可以采用这种风格。但我觉得并不是所有的情况都适用于这种写法。相比之下我更喜欢这样的写法

int fact(int n) {
    return n <= 1 ? 1 : fact(n - 1) * n;
}

或者使用 else

fn fact(n: i32) -> i32 {
    if n <= 1 {
        1
    } else {
        fact(n - 1) * n
    }
}

Go 语言里没有三目运算符,因为语言设计者认为滥用三目运算符可能会降低可读性 1。三目运算符的可读性确实没有 if 语句高,但是问题的核心其实不在三目运算符。三目运算符的鼻祖 C 需要它是因为 C 的 if 语句不是一个表达式,所以需要一个新的语法来表示 if 表达式。相比很多语言就不需要三目运算符,因为它们的 if 本身就是一个表达式。同时 if 语句的可读性也比三目运算符高不少,用 else if 再添加几个 branch 也不会降低可读性。

对我来说基于表达式可以让代码更容易理解。在理解一个基于表达式的程序时,我们可以自底向上地学习程序,从小的表达式开始理解,再理解上级的表达式。如果表达式没有副作用,在学习了这个表达式之后就可以把它看作一个黑盒了。一般来说函数式的语言都会支持更多类型的表达式(如 if 表达式),函数式语言的宗旨之一也是通过组合无副作用的函数而实现更复杂的功能。