nim はじめました
nim はじめました
教訓
LLM は マイナー言語や最新バージョンなどは把握していないため、LLMに聞くと高確率でハルシネーションしたり、実装してエラー→旧バージョンではこうだった的な嘘を教えてくれます。
環境は intel macOS 15.6.1です。
nim 2.2.4
nim をインストールするとき、 choosenim でインストールした方がいいらしい
homebrewでインストールしてすすめるとnimlsp がパッケージマネージャの nimble でインストールできないので消す
# brew で nim をインストールしている場合 のみ brew uninstall nim # インストール curl https://nim-lang.org/choosenim/init.sh -sSf | sh
指示にしたがって、 ~/.bashrc を編集して読み込み
# インストール確認 nim --version nimble --version which nimsuggest # インストール nimble install nimlsp
gzip 圧縮されたファイルの解凍
シリーズとして NOTICE.xml.gz ファイルを解凍して、XMLファイルを抽出。そこから情報を取るというものを実装することを題材にしている。
import zlib はダメ
LLMによると、nimでは import zlibで標準添付されている zlibパッケージでgzip解凍できるとの情報があった。これはシステム側の zlib.h と libz.*dylibが必要らしい。
そのまま実行すると import zlibで zlibがみつからないというエラーになった。
nim で C言語に変換しているので、システム側の zlib.h と libz.*dylibがみつからないためかもしれないと判断して、探した。
Intel macOSの新しめのバージョンでそれらは $(xcrun --show-sdk-path)/usr/includel/zlib.h と/usr/lib/libz.1.2.12.dylibだろう。
これにあわせて、インクルードパスとリンカオプションを渡して試した。
nim c -r --passC:"-I$(xcrun --show-sdk-path)/usr/include" --passL:"-lz" src/nim2.nim
しかしこれも同様にだめ。結局 v2.2.4は import zlib で失敗する。
念のためにimport zlibで読み込む zlib.nim がそもそもない。
# インポートするzlib.nim がない find ~/.choosenim/toolchains/nim-2.2.4/ -name 'zlib*'
さらに調べると、v2.2.4のnimは、zlibはサポートしていないことを調べてみたら、nim標準の std/compress 等でzip圧縮などはサポートしているが、gzip解凍はサポートしていないとのことがわかった。
import zlibは終了
zippy を選ぶ
gzip展開する方法を調べると外部ライブラリで、zippy などがあるらしい。zippyはnimだけでいいので楽そうということでインストール
# インストール nimble install zippy # インストールできたらあるはず find ~/.nimble/ -type f -name '*zippy*'
import zippy, os, strutils proc gunzipFile(inputPath, outputPath: string) = let compressed = readFile(inputPath) let decompressed = uncompress(compressed, dfGzip) writeFile(outputPath, decompressed) echo "解凍完了: ", outputPath when isMainModule: if paramCount() < 1: echo "使い方: ", getAppFilename(), " <input.gz> [output]" quit(1) let inputFile = paramStr(1) let outputFile = if paramCount() >= 2: paramStr(2) else: # 拡張子 .gz を削除して出力ファイル名を生成 if inputFile.endsWith(".gz"): #inputFile[0 ..^4] inputFile[0 .. inputFile.len - 4] # else: inputFile & ".out" gunzipFile(inputFile, outputFile)
# コンパイル nim c src/gunzip.nim # NOTICE.xml.gz を解凍して NOTICE.xml に保存 src/gunzip ~/Downloads/NOTICE.xml.gz NOTICE.xml
一応できた。