ミニマリズムについて考えるとき、私はLispとGoについて考えます。Lispを使用すると、関数とリストだけが得られます。これは、できるだけ簡単です(まあ、もう少しありますが、何でも)。ただし、Goのケースの方が興味深いと思います。
Goはシンプルになるように設計されています(それはまともな読みです)。彼らが使用する用語は「機能の直交性」です。つまり、機能は本当にユニークなものを提供する場合にのみ追加する必要があります。これは、著者の(Russ CoxとRob Pikeが思い浮かぶ)Plan9の関与に起因するようです。Plan9は、単純さを念頭に置いたUNIXの再考でした。(最小限の設計に興味がある場合は、単純なウィンドウシステムに関するRob Pikeの論文が参考になります。)
構文の簡単な例を次に示します。
1つのループ構造のみ
ループは次のいずれかになります。
無限ループ
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, ...
- スローする必要がなくなります(エラーを最後の戻り値として渡します)
- 出力パラメータの必要がなくなります
- タプルの必要性を取り除きます
インターフェース
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:
}
結論
構文のすべての部分を説明するつもりはありませんが、できればミニマリズムが何をすることができるかを見てください。この言語が興味深いのは、大量の新しい機能が追加されたためではなく、他の言語の最高の機能を何も追加せずに使用しているためです。
通常、問題を解決する「最良の」方法が1つあります。たとえば、メーリングリストでは、多くのユーザーがジェネリックがないと苦情を言っています。話し合った後、彼らはやりたいことはすべてインターフェイスでできることに気付きます。慣用的な構文の例については、効果的な説明を参照してください。
KISS言語の利点は、コードスタイルが言語によって制限されているため、慣用的なコードを記述できることです。たとえば、Goでは、次のような記述はできません。
if <condition>
statement;
中括弧を使用する必要があります。
if <condition> {
statement;
}
構文には他にも多くの例があり、他の人のコードを読みやすくします。
機能的な言語に対するKISS言語の利点:
- 他人のコードを理解しやすい
- 言語全体を理解しやすい(C ++は理解しにくいことで有名です)
- 構文ではなくアルゴリズムに焦点を当てる