なんだこれは

はてなダイアリーから移転しました。

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.hlibz.*dylibが必要らしい。

そのまま実行すると import zlibで zlibがみつからないというエラーになった。

nim で C言語に変換しているので、システム側の zlib.hlibz.*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

一応できた。