当我想到极简主义时,我想到了Lisp and Go。使用Lisp,您所拥有的只是函数和列表,这些函数和列表几乎就可以得到(很简单,还有更多,但是随便什么)。但是,我认为Go案例更有趣。
Go的设计很简单(读起来不错)。他们使用的术语是“功能正交性”,这意味着只有在提供真正独特的功能时,才应添加任何功能。这似乎是由于作者(想到Russ Cox和Rob Pike)参与Plan9引起的,这是对UNIX的重新构想,其思路简单。(如果您对最小化设计感兴趣,那么Rob Pike的有关简单窗口系统的论文将是不错的阅读。)
以下是一些简单的语法示例:
只有一个循环结构
循环可能类似于以下之一:
无限循环
for {
}
While循环
for <conditional> {
}
传统for循环
for i := 0; i < 10; i++ {
}
Foreach循环
// works for maps or arrays
for k, v := range arr {
}
多功能开关
switch {
// cases must be evaluate to a boolean
}
switch <value> {
}
switch t := <value>; t {
// can use t inside
}
多次回报
return val1, val2, ...
- 消除了抛出的需要(将错误作为最后的返回值传递)
- 消除了对out参数的需求
- 消除了对元组的需求
介面
type X interface {
DoSomething()
String() string
}
嵌入
type A struct {
Thing string
}
type B struct {
A // embeds A in B, so B.Thing refers to A.Thing
}
频道
可用于实现信号量
var c = make(chan bool, 1)
c<-true // semaphore lock
<-c // semaphore free
用于线程之间的消息传递
func produce(c chan<- bool) {
for {
c <- true
}
}
func consume(c <-chan bool) {
for {
<-c
}
}
var c = make(chan bool)
go produce(c)
go consume(c)
可用于处理异步事件
func async() chan bool {
var c = make(chan bool)
go doSomethingAsync(c)
return c
}
// wait for long async process to finish
c := async()
select {
case _ = <-c:
}
结论
我将不涉及语法的每个部分,但希望您能看到极简主义可以做什么。该语言之所以吸引人,不是因为它添加了大量的新功能,而是因为它使用了其他语言中最好的功能而没有任何额外的内容。
通常有一种解决问题的“最佳”方法。例如,在邮件列表中,许多用户抱怨没有泛型。经过讨论,他们意识到自己想做的所有事情都可以通过接口来完成。阅读有效的Go语言以获取惯用语法的示例。
KISS语言的好处是可以编写惯用的代码,因为代码样式受该语言的限制。例如,在Go中,您不能编写以下内容:
if <condition>
statement;
您必须使用花括号:
if <condition> {
statement;
}
语法中还有许多其他示例,这使阅读其他人的代码更加容易。
KISS语言相对于特色语言的优势:
- 更容易理解他人的代码
- 易于理解整个语言(C ++以难以理解而臭名昭著)
- 专注于算法,而不是语法