2018年12月16日

nim言語に入門した時のメモ 2018/12

nim言語に入門した時のメモ 2018/12
はじまり
2017年末にrust言語を発見した時、同時に発見していた言語、nim。
rust言語はそれから3ヶ月弱で挫折しました。orz
。。。時は流れて。。。ようやくnim言語のことを思い出した。



公式FAQ
https://nim-lang.org/faq.html

特徴
Pascal/Delphi/Lazarus風味
    公式FAQでは影響が強い順に以下となっている
     Modula3, Delphi, Ada, C++, Python, Lisp, Oberon.
    緑色の言語がPascal系。

Pascal風味なところ:
    Type宣言、Set型、case文の書式、関数内関数、
    整数の割り算は「div」、余りは「mod」、
    シフト命令は 「shl, shr」、
    論理演算子は、「xor, and, or, not」、
    等々、Pascalと同じだ。

Python風味なインデント構文
    "スペース文字"を使ってインデント構文を形成するのはPythonと同じ。
    インデント量は自分の場合「4」にした。
    公式系では「2」。
    さすがに「2」は、みずらくて やだなぁ。。。orz
    https://nim-lang.org/docs/manual.html#lexical-analysis-indentation

Pythonのpass
    https://nim-lang.org/docs/manual.html#statements-and-expressions-discard-statement
    Pythonでたまに使う「pass」はnimでは「discard」になる。
    空っぽの関数は以下になる。
proc foo() = discard
ちなみに、この空き関数を関数テーブルに入れると意味不明のエラーが出て、 これが原因だと気づくのに時間がかかった orz 変数は、すべて初期化済み https://nim-lang.org/docs/manual.html#statements-and-expressions-var-statement プログラムが開始した時点で、全てのグローバル、ローカル変数は 規定値で初期化済みである。規定値が何かはリンク先を参照。 例えば、数値型は0,文字列は「""」, シーケンス(seq)は「@[]」で初期化される。 この初期化動作を回避させることもできる。 result変数は「定義済みで初期化済み」 https://nim-lang.org/docs/manual.html#statements-and-expressions-return-statement 値を返す関数は、関数内で暗黙的に「result変数」が"返り値と同じ型"で定義済みで、 且つ、初期化済みである。(注1) 初期化値は上と同じ。 (注意点:result変数を関数内に於いて自前で定義してしまうと、 正しい値を返さないのでやってはいけない。)
proc intAdd(n:int): int = for i in 1..n: result += i # 1からnまで加算して返す proc strAdd(s:string): string = for i in 1..3: resutl &= s # resut = result + s と同じ意味
以下は全て正しく動作し、同じ値を返す。 「...」は、他の文があってもなくても良いという意味。
(1) proc add(x,y:int):int = ... return x + y (2) proc add(x,y:int):int = ... result = x + y (3) proc add(x,y:int):int = ... result = x + y ... return result (4) proc add(x,y:int):int = ... result = x + y ... return (5) proc add(x,y:int):int = ... x + y
(3)と(4)は表現がしつこすぎて使わないと思う。 戻り値のある関数呼び出しで、"戻り値を使っていない"と怒られた https://nim-lang.org/docs/manual.html#statements-and-expressions-discard-statement 呼び出し側で戻り値を使わない時は「discard」を付けないとコンパイルエラーになる。
定義時: proc add(x,y:int): int = x + y 呼び出し時: discard add(2,3)
この動作仕様は回避可能。 関数内のスタティック変数は{.global.}で定義 C言語でたまに使う「変数の"関数内static宣言"」は、nimでは
proc foo() = var 変数名 {.global.} = 5 ... ...
の様に書く。 関数名、変数名、等々の命名規則 https://nim-lang.org/docs/manual.html#statements-and-expressions-if-expression これが結構変わっていて、Pascal系の「大文字、小文字は区別しない」の 類似型と思われる。その規則はこう、 (1) 大文字、小文字は区別しない。但し、最初の一文字目を除く。 (2) "_"(アンダースコア)は無視する。 なので以下の2つの識別子は同じものと見なされる。
get_outque_count() getOutQueCount()
以下は違うものと見なされる。
var barbar = 1 var Barbar = 1
これについてのスレッドがこちら、 https://forum.nim-lang.org/t/4388 ifとcaseは値を返せる ifとcaseは式でもあるので値を返せる。 elif節は省略可だが、else節は省略できない。
var y = 10 let x = if y > 3: 複文も可 返す値 elif y == 1: 複文も可 返す値 else: 複文も可 返す値
実はblockも値を返せる manualでは探せなかったけど、Web上では見つかった。 関数内関数 普通に記述できるけど、manualでは確認できなかった。 (注1) Pascalの場合、result変数は未初期化。


posted by Copyright (C) avrin All Rights Reserved. at 10:01| Comment(0) | nim言語 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。