nim
readline(stdin)が多バイト文字を受け付けない nim終了のお知らせ Bosque Programming Language https://www.microsoft.com/en-us/research/project/bosque-programming-language/ > The Bosque programming language is designed for writing code that simple, obvious, and easy to reason about for both humans and machines. https://github.com/Microsoft/BosqueLanguage 開発が止まっているLuaJITの代わりにこれを使いたい nimがCにトランスパイルできるとしても nimを通してクラス設計とかしたらその分のオーバーヘッドは残りますよね? どういうことですか? C並の性能を出すためにあるものではないと? Nimでカーネルを書くとか無理なのかなーと思ってたんですが 実際やるわけじゃないけど、いまのところ 実際Linuxカーネルのコードは疑似OOPだみたいな説明を見かけたので NimやC++で書いても良いのかもしれない。 個人的にCへのトランスパイラとしてのNimにひじょーに興味がある https://forum.nim-lang.org/t/2261 >So let's say that implementing your game in Nim instead of C++ means 20% larger binary sizes, 20% more RAM usage, and 20% more CPU/GPU usage. NimよりC++の方が速いって言ってる。 ベンチだと真逆なのに nimはgcを使っている。でもCへのトランスパイルができる。 gcということはメモリ解放が暗黙的ということだろう。 Cでは明示的に解放する必要がある。 どうやって解放タイミングを調べてるんだ? GC言語から非GC言語へのトランスパイルがなぜ可能なのか? var name: string = readLine(stdin) なんでvarと書きつつstringと型指定するのか 変な言語仕様だな string name = でいいだろ var name = readLine(stdin) 型推論だっていってるけどこれ可読性低下してる string name = readLine(stdin) これがベスト https://forum.nim-lang.org/t/2541 Nim also can produce a program that will be put in an embedded system. In such environment, usually there is no OS or only primitive OS, and Nim produced program have higher chances to access hardware directly. できそうだ Nimは流行りそうな気がする なんで組み込みでC++なんか使ってるんだ https://forum.nim-lang.org/t/3223 >Basically, 10 OS for 10 CPUs would contain 100 sets of C source code, that get bundled up over in csources.git どうやらNimが適切なCソースコードを作成するには ターゲットのCPUとOSを指定する必要があり、 その組み合わせ全てに何かファイルを用意する必要がある。 これじゃダメだな・・・ 勘違いした。ダメってことはないか Nimコード自体は環境非依存、Cコードにするとき環境依存、ということか Nimってめちゃすごなんじゃないかなあ 細かい言語仕様で嫌いなところがあるけど >>61 name : string := readLine(stdin) のほうがいい。 https://nim-lang.org/ The Nim compiler and the generated executables support all major platforms like Windows, Linux, BSD and Mac OS X. executablesは機械語?Cコード? いずれにせよ環境依存してると思うけど、大抵のプラットフォームをサポートしてます、ってどういうこと? 大抵のプラットフォームに向けてトランスパイルできますってこと? You Nim で Tensorflow が使えるアプリ造っchina YO >>69 var name : string = readLine(stdin) #nameは変更可能 let name : string = readLine(stdin) #nameは初期化後は変更不可 というletとvarに違いがある。 型推論使ったほうがコード読みやすい、書きやすいという人もいるんだよ。 readLineの戻り値の型はstringに決まってるんだから毎回型を書く必要ないと思うけど >>70 NimはC言語に変換してからgcc等のCコンパイラを呼んで実行ファイルを作るんだよ。 C言語は大抵のプラットフォームで使える言語だからマルチプラットフォーム化しやすい。 なので一度書いたNimコードをそれぞれのプラットフォーム上でコンパイルするかクロスコンパイルするだけでだいたいは動く。 けどNimから出力されるCコードは特定のCコンパイラ、OS、CPU向けに書かれているので、それだけでマルチプラットフォームな実行ファイルは作れないらしい。 Nimの標準ライブラリのソースコードを読むとOS、CPUによる違いを吸収するためのコードがときどきあるよ。 Nimのソースコードのcompiler/extccomp.nimにNimが対応しているC/C++コンパイラの情報がまとまっていて、compiler/platform.nimにはOSとCPUの情報がまとまってる。 2次元配列って、 var a: array[10,array[10,int]] とか書くしかないの? Version 1.0 released 23 September 2019 The Nim Team https://nim-lang.org/blog/2019/09/23/version-100-released.html Nim Programming Language Hits Stable Milestone With v1.0 Release https://www.phoronix.com/scan.php?page=news_item& ;px=Nim-1.0-Programming-Language ついでにwandboxのnim ttps://wandbox.org/permlink/npG9hbKwZyKQTXgI?source=post_page-----5d0f58d21e7e---------------------- 1.0おめでとう! ちなみに echo NimVersion echo(NimVersion) NimVersion.echo は同じ意味のコードだよ。Uniform Function Call Syntaxってやつだ windows 10 Nim 1.0.2 入れてみた tdmgcc は前から使ってて gcc は既に path 通してあったので nim 側はファイル展開しただけで何もしなくても良かった (nim.cfg の書き換え(書き足し)も不要だった) path 通さなくても C:\nim\bin\nim c hogehoge で動いた あと 日本語の参考書籍ってなんか出てる? Nim in Action とかはどうだった? >>83 最近のは勝手に gcc 入れてくれるよ。 HANDLEもこっそりtypedefに_PTR変えたんだっけ Nim playground https://play.nim-lang.org/ 次スレから>>1 に入れといてよ しかしver1到達したのに全然盛り上がらんのなお前ら >>85 distフォルダにmingwの7z玉入れておけば、オフラインでのインストールもできるね。 >>84 日本語の書籍はないが、原著のドキュメントは割とわかりやすい。docs/tut1.htmlから読み始めるといいかもしれない。 NIAは評判が良いらしいのと、製本版を買うと電子書籍版が無料で付いてくるらしい。 国内でのNimの翻訳は有志が約二名ほど作業しているが、まだ始まったばかり。時間かかりそうだね。 DLLのCの関数を呼ぶ方法はいくつかあるようですが なぜいくつもあるのでしょうか? どれが一番効率が良いのかとか新しいのかとか判りにくい 単純にdll内の関数を呼びたいならdynlibプラグマを使うのが一番楽。 少し低レベルな機能が必要ならdynlibモジュウルにあるプロシイジャアを使えばいいんじゃなかろうか nimに対応したソースコード可視化ツールってある? nimコードはトランスパイルする前ならクロスプラットフォームなんだろうか? nimのマクロは完成度高いと思う。でも完成度高いマクロという存在自体が糞。 >>102 糞マクロを褒めてるのであって 逆じゃないと思うんだが >>101 >>105が同じってことだろ common lispなんてはるかに糞になるし 小数の配列作りたいんだけどやり方教えてください。 [0.0, 0.1, .. 0.9, 1.0] みたいな。 Python なら hoge = [i/10 for i in range(11)] かな。気持ち悪いけど。 >>69 var name = readLine stdin var name = stdin.readLine で完結してるよ、型推論で>>72 にも言った通り型を何回も書く意味がない。付け加えれば()カッコも 要らない。第一引数クロージャーのラムダ式で言えばカッコが必要ないのに書く意味が無い。そして varとletとは不変性だが、rustやVの様にたかがGCを搭載したく無いだけで、どこでもmut mutして プログラマに負担を強いるより良い(あくまで個人の感想です) さらに、procとfuncも、片方が純関数なのはキーワードとして明示できる統一性としてありだね。 まあpragmaが多すぎる気もするけど、if likely(true)/unlikely(false)の様にCPUキャッシュ分岐予測に 直接関与出来る高級言語としては、他に類を見ない。GCが嫌ならOFFに出来るし、そして重い Stop the Worldが嫌ならそれをしないGCに変えることが出来る、言語としては機能が多くて Goの様に究極なシンプル(なのに統一性が微妙)じゃ無いけど、こりゃ良いわ var name = stdin.read LineEnum 付け加えるとHaskellみたいなproc() = の宣言が微妙キモいけどfunc(): T =があるから、まあ妥当だね rubyの様なreturnを書かないのは良い。result=xは便利だけど微妙....でそこまでやるならOptionと Future、そして例外を統一して欲しかったな。 普通にtry: except: finally:があるのも点数が高い。Araqが言う様に例外と(Label)goto based exceptは ほとんど同じ何だから、今どきの言語が例外が無いのはおかしい。まあ他を悪く言う気はないけど Goの様に意味合い的に同じでfinallyに対応するdeferがあるのも良いよね JavaScript?であれば、JavaScriptはECMAScriptのバージョンとともに型無しのダックタイプから クラス定義で見られるように型を導入して大規模コードを書く際に静的な安全性を求めてきた、 言語的な特徴でもあった動的なメソッド上書きやapply/callは悪とみなされつつ、改良が進む。 TypeScriptもその特徴であろう、altJSあるいはJSX派生と呼ばれる一種の方言が多量に誕生した 一方でJavaScriptの遅さや1言語依存からwasmが考え出されて多くのコンパイラでwasm開発が できるようになった。Nimも例に漏れずJSバックエンド及びwasmコンパイルが可能である。 Rustもwasm開発はそうだがJSバックエンドは無い、Goもwasmは出来るがサイズが大きい NimはGoに比べても型チェックが厳しい、Rustはそれに借用いわゆるボローチェックがそれに 加わるRustもそうだが型安全性はばつぐんだ jsって割と底辺だと思うから Nimはそれより上だろ Windows defenderでウイルス判定される 頼むからもう少し流行ってください。Dropトレイト、Rcトレイトと戯れてあいつのコードを直したくない 2015年2月なんて大昔だろ…Version 0.11頃の話、貼る奴w 間違えた。 2月だから0.11さえ出てないわ、0.10.2… >>120-122 バージョン1.4.8がリリースされました 2021年5月25日ニムチーム Nimチームは、Nim1.4の4番目のパッチリリースであるバージョン1.4.8を発表できることを 嬉しく思います。バージョン1.4.8は、1か月のハードワークの結果であり、23のコミットが 含まれており、最も重要なバグが修正され、ORCメモリ管理がさらに改善されています。 すべてのユーザーにバージョン1.4.8をアップグレードして使用することをお勧めします。 リリースのハイライト develブランチと同様に、v1.4.8はcsources_v1を使用して構築されています。つまり、 AppleM1チップで使用できます。 バージョン1.4.6は、いくつかのウイルス対策ソフトウェアでいくつかの誤検知を引き 起こしました。私たちのテストによると、これはv1.4.8では発生しないはずです。 なんか結局流行らなかったな 2019ごろはちょっと来そうな雰囲気出してたのに Luaの理念は、簡素、高効率、高移植性(simple, efficient, extensible)、現在はpowerfulとかに変えた。 JITもあるが型の概念が希薄で基本はNativeではない。GCあり、プロトタイプベースのOOPSもC/C++の 相互運用も図られているが、主な用途は本体のプログラムを拡張するスクリプト、ゲームの拡張や 3Dモデリングソフトなどの拡張。 一方、Nimは「Efficient, expressive, elegant」(効率的、表現力豊か、エレガント)であり、型は厳格。 関数、あるいはプロシージャ呼び出しも厳密。Goにあるinterface{}のようなものは無く、Cというか リンケージ指定、オブジェクトコピー方法、インライン展開など明示するような言語と一体化されたプラグマ。 言語と一体化されたマクロ・テンプレート。状況で選べるGC、例外try-catchとdeferを全否定をしない。 RustのようにGCを排除したためプログラマに押し付けた借用チェックは無い。 Goよりも小さくて速いGC、それによる速度低下は最小限、Rustは学ぶ価値が確かにあるが非常に高い敷居。 Nimは非常に低い敷居(Goほどではないが)、表現力はC/C++そのもの、限りなく抑え込まれたタイプ量。 Nimにガベージコレクション(GC)有りは事実なのですが、 NimはオプションでGC無しにできるので、 Nimバージョン:1.5.1でRustのボローチェッカー に似た「View types」が実装されれば GC無しで、View types参照の有効性を検証する ことによってメモリ安全性を保証しつつ高速化して C/C++/Rustの代替に出来ますか? Rustのメモリ安全性はボローチェッカーによって担保されているが、 Nimと比較してRustはタイプ量が多い事により限りなく低い生産性と C++のような高い難読性、超巨大なバイナリ生成性能を兼ね備えています Nimはバージョン1.5.1でRustのボローチェッカーに似た「View types」が実装されれば、 GC無しのView typesで参照の有効性を検証することによってメモリ安全性を保証しつつ 限りなく抑え込まれたタイプ量で高速化したCのソースコードを吐き出せます Nimソースコード ==nimコンパイラ==> Cソースコード ==Cコンパイラ==> バイナリ なので、nimコンパイラが通った時点でメモリ安全性が担保されませんか? Nimの実験的特徴 著者: アンドレアス・ルンプ バージョン: 1.5.1 http://nim-lang.github.io/Nim/manual_experimental.html Nimは限りなく抑え込まれたタイプ量で高い生産性とPythonのような高い可読性を実現し ているにもかかわらず、高速なCのソースコードを吐き出せるのでC言語でリモートワーク されている方は割り振られた仕事が早く終わっても終わってないふりをして怠けることができる 「怠け者とはこうあるべきだ!」と言うとても大事な事を Nim は我々に教えてくれます Rustのメモリ安全性はボローチェッカーによって担保されているが、 Nimと比較してRustはタイプ量が多い事により限りなく低い生産性と C++のような高い難読性、超巨大なバイナリ生成性能を兼ね備えています Nimはバージョン1.5.1でRustのボローチェッカーに似た「View types」が実装されれば、 GC無しのView typesで参照の有効性を検証することによってメモリ安全性を保証しつつ 限りなく抑え込まれたタイプ量で高速化したCのソースコードを吐き出せます Nimソースコード ==nimコンパイラ==> Cソースコード ==Cコンパイラ==> バイナリ なので、nimコンパイラが通った時点でメモリ安全性が担保されませんか? Nimの実験的特徴 バージョン1.5.1 http://nim-lang.github.io/Nim/manual_experimental.html 第二プログラミング言語として Rust はオススメしません Nim をやるのです https://wolfbash.hateblo.jp/entry/2017/07/30/193412 Nimは限りなく抑え込まれたタイプ量で高い生産性とPythonのような高い可読性を実現し ているにもかかわらず、高速なCのソースコードを吐き出せるのでC言語でリモートワーク されている方は割り振られた仕事が早く終わっても終わってないふりをして怠けることができる 「怠け者とはこうあるべきだ!」と言うとても大事な事を Nim は我々に教えてくれます いつの間にかJetBrainsのプラグインが出てたね。今更気がついたよ これもかなり良いんじゃない? https://plugins.jetbrains.com/plugin/15128-nim const str = [0, 1, 2, 3, 4] for i in 0||str.high: echo str[i] # nim --passC:"-fopenmp" --passL:"-fopenmp" c main.nim >>92 Cの関数だけでもいろいろなコンパイラーにより規約が違うから、ダイナミックなリンケージを非常に素直に 書ける言語はこれくらいだと思う。rustもFFIで呼べるけど https://ja.wikipedia.org/wiki/ 呼出規約 Nim言語の開発者が$100k相当のBitcoinの寄付を受け取ったことが話題になっています。 www.reddit.com/r/programming/comments/qg2srd/nim_receives_100k_in_bitcoin_donations/ >>99 公式での処理系は基本的にはC/C++のトランスコンパラですがJSのトランスコンパラとしても動作します。 言語的には依存している分けではなく、gccやclangの最適化の恩恵を受けるためにあえてそのようにして いるようです。 また直接バイナリを吐き出す別のコンパイラarnetheduck/nlvmもあります。CrystalやRust、Swiftなどの LLVMバックエンドと同じです。コンパイル時間を短縮しllvmバイナリとして僅かに小さくなります。 RustよりC++より速いんですか? 始めてみようかな 1.6.x系だけDLしようとするとマルウェア警告出るんだけどこれ大丈夫なんかね Nimの公式サイトから入手したものなら大丈夫なはず。 Nimに含まれている実行ファイルやNimでコンパイルしたプログラムがアンチウィルスソフトウェアに誤検出される問題は多くの人々から報告されている。 Nim言語でマルウェアを書いてる人がいるせいで誤検出さるようになったらしい。 アンチウィルスソフトウェアは悪いことしないプログラムでもマルウェアと似たようなビットパターンを見つけるとマルウェアとみなすっぽい。 マルウェアと誤検知されたくなければnimで開発しない方が無難か。 多くの人が使っているプログラムでない限り誤検出される可能性はある。 C++使ってたころにビルドが完了してすぐに誤検出されことがあったし。 そういうどっちもどっち論じゃないだろ。>>148 は有意に誤検知が多いと言っているように見えるが。 Nimを書き初めて1ヶ月...procの第一引数に設定したオブジェクトにprocがバインドされる謎構文にはたまげたけど書き味がいいし気に入ったなあ >>154 ちょっと誤解しているようだけど、a.foo()って書いたら自動的にfoo(a)に変換されるだけだよ。 第一引数の型にそのprocがバインドされるわけじゃないよ。 X.nim: type Foo* = object x: int proc foo*(f: Foo) = echo f Y.nim: import X proc bar*(): Foo = Foo() Z.nim: import Y #X.nimをインポートしてないとfoo()は呼べないよ bar().foo() Nimではプロシージャの呼び出し方が何通りかある。 echo("Hello") # Command invocation syntax echo "Hello" # Method call syntax "Hello".echo "Hello".echo() # Generalized raw string literals # 引数が文字列リテラル一個のときのみ echo"Hello" >>155 なるほど👀 それでも変わった感じですよねえ >156 Method call syntax はスマートだから他言語でも流行ってほしいところ。 特にPythonは真っ先に採用して欲しいわ。 あまり何通りもあるのはperlみたいになりそうでよろしくないな。 >>160 急にコンパイルできなくなって困ってたら vccexe,exeがトロイ認定受けて削除されてた… MSはnimをトロイだとみなしてるのか >>161 前に一回同じ現象出たわ コンパイル失敗するしWindows Defenderはうるさいしで何かやらかしたかと思った >>164 すまんドイツ人だったわ 顔面からずっと南米の人だと思ってた >>169 むしろ--mm:orcならRustよりNimのほうが循環もGCするだけメモリ安全だし、リリースビルドでオーバーフローチェックが意味不明にoffになり、言語仕様としてループindexにunsignedを使うRustのどこが安全なのかと小一時間。 まあNimでのdangerコンパイルと似てるし、構文上まだ危険な超絶ハック表現が出来てしまうので素人にはオススメ出来ない諸刃の剣。だけどsqlパッケージの文字列前提を絶対変えてほしい RustのBorrow Checkerはメモリリークを防ぐものではないからね templateまたはmacroの第一引数がuntypedだとmethod call syntaxが使えない。 method call syntaxでgenerics parameterを指定するときにfoo.myproc[:int]()みたいな感じで[]の中の初めに':'を付けないといけない。method call syntaxを使わないときは':'は不要。 という感じでmethod call syntaxにちょっとした罠がある。 macroが全く別言語になってる錆やその他諸々よりも、ちゃんと言語の最小サブセットになってるからまだマシ win10 x64 nim-1.6.6 x64 です (A) var hoge = newSeq[uint16](16) # hoge[...] に wchar_t の文字列 L'\x0' 終端がある (サロゲートとか無い状態で 4文字分) echo convert(cast[string](hoge[0..3]), "utf-8", "utf-16") (B) var fuga = newSeq[char](16) # fuga[...] に char の文字列 '\x0' 終端がある 4文字分 echo cast[string](fuga[0..3]) (B)の方は期待通り 4文字分出力されるのですが (A)の方はなぜか 2文字くらいで切れてしまいます echo convert(cast[string](hoge[0..7]), "utf-8", "utf-16") と修正すると 4文字出ましたが何か腑に落ちません >>176 そもそも何をしたいの? windowsで日本語を表示したいだけならutf8を使ってればOk デフォルトでNimのコマンドラインプログラムを実行するとchcp 65001コマンドを実行したときのようにコードページをutf8に変更される。 chcp 65001を実行してもちゃんと日本語が表示されるようにターミナルを設定しよう。 utf16なテキストをutf8に変換して表示したい場合はできるだけcast使わないようにコードを書こう。 castは危険なのでできるだけ使わないようにしよう。 (castはビットパターンが同じまま別の型と見なす変換なので実装詳細を知らずに使ってるとうまく動かない) 最初からstringに文字列を格納するようにするとか、ループで一文字づつstringにコピーすればcastは避けられると思う。 上の例とは若干違いますが var u16 = newSeq[uint16](8) for n in 0..7: u16[n] = cast[uint16](65 + n) u16[7] = 0 echo u16 # -> @[65, 66, 67, 68, 69, 70, 71, 0] echo convert(cast[string](u16), "utf-8", "utf-16") # -> ABCD let u8 = cast[ptr UncheckedArray[array[16, uint8]]](u16[0].addr)[0] echo u8 # -> [65, 0, 66, 0, 67, 0, 68, 0, 69, 0, 70, 0, 71, 0, 0, 0] ABCD のところが ABCDEFG にならないのがなんでかなーというのも 同様の現象が原因だろうと思います echo convert("\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x00\x00", "utf-8", "utf-16") これは ABCDEFG と出力されます >>178 の例で var u16 = newSeq[uint16](16) と定義しておくと(他は変更無し)(後半は0で埋まってる) ABCDEFG と表示されます まあ cast に何を期待してるんだと言われればそれまでなんだと思いますが腑に落ちませんでした nimってIDEやデバッガは近いうちに計画されてるの? vscodeでもいいんだけど、ちゃんとしたデバッガは欲しいな 条件付きブレークポイントやコンテナの中身が見れる程度でいいんだが >>182 vscodeのプラグイン nimsaem.nimvscode + webfreak.debug ではだめか? やっぱりその組み合わせか どうにも使いづらいんだよねぇ 言語仕様は理想に近いんでもっと流行ってほしいんだが、これまでの情勢からあまり期待できなさそうだな >>181 seqをstringにcastしているけど、ちゃんとseqとstringの実装詳細、データ構造を理解した上で安全だという確証があってcast >>181 seqをstringにcastしているけど、ちゃんとseqとstringの実装詳細、データ構造を理解した上で安全だという確証があってcastしてるの? そうでないならcast使うのはやめたほうがいいよ。 >>182 NimにGDBでデバッグできるようにするプラグインが付属していて gdbでブレークポイントをおいたり変数の中身を表示したりできます。 https://internet-of-tomohiro.netlify.app/nim/gdb.ja.html >>178 >>180 var u16 = newString(16) for n in 0..7: u16[n * 2] = cast[char](65 + n); u16[n * 2 + 1] = '\0' u16[14] = '\0' echo u16 # -> A B C D E F G echo convert(u16, "utf-8", "utf-16") # -> ABCDEFG >>189 castは極力使わないほうがいいのでビット演算使ってu16の値をcharに変換したほうがいいよ。 お手本コードを投稿しようとしたらcloudflareが悪意あるコードと勘違いしてブロックされた こんな感じです let c=65u16 + n u16[n * 2] = char(c and 0xff'u16) u16[n * 2 + 1] = char(c shr 8) 言語仕様としてはモダンな言語の中で1番わかりやすいし Rustで書くほどでもない軽いスクリプトとかならNimで良いんだけど流行らんなあ やはり個人開発者の言語が流行ることはもうないのか var ws = newWideCString(8) # ws.len == 0 for n in 0..7: ws[n] = Utf16Char(65 + n) # ws.len == 8 ws[7] = Utf16Char(0) # ws.len == 7 echo ws # ABCDEFG と比べて 驚き最小の法則ですね var s = newString(8) # s.len == 8 for n in 0..7: s[n] = char(65 + n) # s.len == 8 s[7] = '\0' # s.len == 8 echo s # ABCDEFG 驚き最小の法則 var ws = newWideCString(8) echo ws.len # -> 0 for n in 0..7: ws[n] = Utf16Char(65 + n) echo ws.len # -> 8 ws[7] = Utf16Char(0) echo ws.len # -> 7 echo ws # ABCDEFG と比べて var s = newString(8) echo s.len # -> 8 for n in 0..7: s[n] = char(65 + n) echo s.len # -> 8 s[7] = '\0' echo s.len # -> 8 echo s # ABCDEFG proc testfunc(x: cint): cint {.exportc, cdecl, dynlib.} = return x と描かれたソースを nim c --app:lib -d:release hoge.nim でコンパイルするとカレントディレクトリに hoge.dll が生成されて import ctypes ctypes.cdll.LoadLibrary('./hoge.dll').testfunc(123) と実行出来たのですが nim cpp --app:lib -d:release hoge.nim でコンパイルするとカレントディレクトリに hoge.dll が生成されているはずなのに LoadLibrary のところで FileNotFoundError: Could not find module '(fullpath)\hoge.dll' (or one of its dependencies). Try using the full path with constructor syntax. と言われてしまいます 多分 or one of its dependencies が引っ掛かっているのではないかと思うのですが 何が足りないのでしょう? stdc++ の shared library ? libstdc++-6.dll をコピーしてみましたがだめでした >>203 objdumpっていうプログラムを使えばどのdllを使っているか見れるよ。 使い方忘れたからググってね。 Nimをインストールしたときにgccもインストールしてればそのときにobjdumpも一緒にインストールされる。 他にも依存しているdllを見れるツールは色々あるけど >>206 windows用にもobjdumpあんの? windows で nim 入れるときに一緒に入った mingw64 の中に objdump がありました >>206 objdump -p hoge.dll | findstr "dll" で出て来たのが libgcc_s_seh-1.dll libstdc++-6.dll kernel32.dll msvcrt.dll でした libstdc++-6.dll だけではなく libgcc_s_seh-1.dll も必要でした 無事動作しましたありがとう import nimpy import nimpy/py_lib as lib initPyLibIfNeeded() let wx = pyImport("wx") let app = wx.App() let frm = wx.Frame(nil, -1, "Hello, work!") discard frm.Show() discard app.MainLoop() 簡単杉感嘆 >>213 セルフホストってどういう意味で言ってるかは知らないけど Nim forum自体がNimで実装されてるよ。 https://github.com/nim-lang/nimforum プログラミング言語でセルフホスティングっていったらコンパイラが自身の言語で実装できることだろうよ しかしできたとしてトランスパイラをセルフホスティングと呼んでいいのか 出力がC言語か機械語かの違いぐらいだしトランスパイラだとしても普通にセルフホスティングって呼ぶよ https://github.com/nim-lang/Nim ここにNim言語のコンパイラがあるけどソースコードはNim言語で書かれている。 gccなどのCコンパイラとgitがあればソースコードからビルドできる。 ソースコードからビルドするときはまず古いバージョンのNimコンパイラをC言語に変換したものをダウンロードしてCコンパイラでビルドする。 それでビルドしたNimコンパイラで最新のNimコンパイラをビルドする。 Cコンパイラは一般的にC言語で実装されているが、どうやってCコンパイラをビルドするのか あらかじめビルド済みのCコンパイラを持ってきてビルドする ではそのビルド済みのCコンパイラはどうやってビルドされたというのか たぶん世界で最初のC言語はアセンブリかB言語かフォートランか何か別の言語で書かれていたんじゃないの? toSeq(0..360|24).map(rad) と描くと Error: type mismatch: got <SteppedSlice> と言われて怒られたので toSeq(0..360).filter(x => x mod 24 == 0).map(rad) で描き治したら一応動く訳だが 0..360|24 観たいに描く方法は? iterator `|`(x: HSlice; y: int): int = みたいな演算子のイテレータを定義すればいいじゃん。 >>223 iterator items(s: SteppedSlice): int = var c = s.a while c <= s.b: yield c c += s.step を定義したらイケました 有賀豚 1,2ヶ月くらい前に Nim言語のマニュアル日本語訳がOSDNのページにアップされていて これで5年後には結構人気が出るかもと喜んでいたら 突然ページが消滅してショックだった キャッシュを探したけど発見できないので コピー持ってる人がいたらどこかにアップしてもらえらばありがたいです (ライセンス上問題が無ければですが) 古いキャッシュならInternet Archiveにあった https://web.archive.org/web/20201128232605/http ://nim-lang-081.osdn.jp/ https://web.archive.org/web/20200928154858/http ://nim-lang-081.osdn.jp/docs/manual.html まあキャッシュ古すぎて更新追いついてないけど https://ja.osdn.net/users/megumi_engines/projects/ このひとがオーナーになってるプロジェクトの1つみたいだけど、Twitterのアカウントも消えちゃってるね プライベートが忙しくなったのかな Last Update: 2022-09-21 01:12 Nim プログラミング言語 - 非公式日本語版 (翻訳活動終了)に関する活動はすべて終了しました。リポジトリの再公開予定はありません。 理由はよう判らん githubにfork無かったかな 日本語訳マニュアルの代わりになるかどうかはわからんけど amazonで日本語のNim言語の書籍が売られてるよ。 当時高校生の描いたやつか CやC++との連携について 一行しか描かれてなかったな c2nim にがっかり感なんだけど こんなもん? それとも使い方間違ってる? 期待し過ぎ? わかっているのかもしれないけど、c2nimはどんなC言語のコードもNim言語に変換するものではない。C言語ライブラリをNim言語から使うためのバインディングをCのヘッダーファイルから生成するツールみたいなものだ。 c2nimに似たことができるこんなツールもあるよ。 https://github.com/PMunch/futhark template hoge(fuga: string): string = fmt"{fuga}" 観たいなときに fuga が undeclared になるんだけどなんで? >>237 なるほど良さげ Sounds great, what's the catch? Futhark is currently in an alpha state. It currently doesn't support C++, and it doesn't understand things like function-style macros. It might also mess up on definition types I haven't seen yet in the small handful of libraries I've tested it against. All of these things are things I hope to get fixed up. >>242 自己レス 出来ました本当にありがとうございました template hoge(fuga: string): string = block: let injectedfuga {.inject.} = fuga fmt"{injected_fuga}" https://qiita.com/momeemt/items/000d1f6c384f4f00e103 Pythonスレでテンプレになってる内容をNim用に変更したので 次スレからはテンプレにしてください -----ここから Nimの★ソースコードをそのまま5ちゃんに貼るとインデントが崩れてチヌ★ 【【【複数の連続半角スペースはなにもなかったことにされる&タブは普通には入れられない】】】掲示板の仕様なので、 プログラム文は↓等の、いわゆるコードうp用サイトに貼ってこいください。 ttps://glot.io/new/nim 結構使える。 ttps://play.nim-lang.org/ 本家。 ttp://ideone.com/ デフォ設定はC用のため、言語選択ボタン押下がピコ手間かも。 ttp://pastebin.com/ まずまずシンプル。 -----ここまで これで逝けました https://ideone.com/HBEKZu pragmaのNimNodeを指定出来なかったらしい ideone の Nim は (nim 0.19.4) ↑のWandboxでも最新の安定版Nimを使えるしコードを共有できる。 ここまでのまとめ ttps://glot.io/new/nim 結構使える ttps://wandbox.org/ 最新のNim使える ttps://play.nim-lang.org/ 本家 ttp://pastebin.com/ ソース貼り付けのみ >>250 wandboxだと(っていうかそれ以外でもかもだけど) 実行ボタンの上に $ nim c ./prog.nim って表示されてて c を cpp に変更したくても出来ない 左上の「コンパイルオプション」らしい枠に cpp を入れると $ nim c ./prog.nim cpp になったわ >>254 確かにwandboxだとnim cppでコンパイルできないっぽいね もしかしたらgithubのwandboxリポジトリに要望を出せば対応してくれるかもしれない。もしくは自分で機能を実装してpull requestを出すか type Hoge* = object fuga*: int としないで type HogeObj* = object fuga*: int Hoge* = ref HogeObj とするのは必須?習慣? 前者のデメリットは DeepCopy だというのは判るのですが 毎回後者を使った方が良い? 横からだが >>259 のbyrefと >>258 は完全に等価? proc 読んだとき ref のフリをする fake が 259 ref objectは一つのオブジェクトを複数のオブジェクトから参照したいときや継承使ってオブジェクト指向なコードを書くときに必要となる。 それ以外の場合はrefのついていないobjectのほうが速くなることが多い。 ref型は常にヒープに確保されポインタ経由でアクセスされるけどobjectだとスタックに確保できるしポインタで間接的に参照する必要もない。 object型のseqだとメモリ上に連続して確保されるけどref object型のseqにするとメモリ上に連続して確保されるとは限らないからキャッシュミスが起きやすくなる。 ある程度大きなobjectはプロシージャに渡すときに自動的にポインタ経由で渡されるからコピーのコストが問題になることがあんまりないと思うよ。 C++で言えばobjectはstructをそのまま使っている感じでref objectはstructをstd::shared_ptrごしに使っている感じ。 proc incx(i: int): int = let j = i {.emit: "++j;".} result = j echo incx(5) https://glot.io/snippets/gfgq0p65a6 let で定義された変数も書き換え可能なんですね素敵ですね >それ以外の場合はrefのついていないobjectのほうが速くなることが多い。 これはどうかなぁ 遅くなることの方が多いと思うが >>265 どうしてrefのついてないobjectのほうが遅くなる場合が多いの? >>263 emit pragma使っているんだからNimの安全性は無効になる。 rustでunsafeを使うようなもの。 >>262 >ある程度大きなobjectはプロシージャに渡すときに自動的にポインタ経由で渡されるから ってことは {.byref.} 描く必要無い? >>268 自動でやるのは関数の引数にオブジェとを渡した時だから それ以外にコピーが頻繁に発生しないなら byrefいらないんじゃね? >>268 https://nim-lang.org/docs/manual.html#procedures-var-parameters に var parameters are never necessary for efficient parameter passing. Since non-var parameters cannot be modified the compiler is always free to pass arguments by reference if it considers it can speed up execution. って書いてあります。 >>268 https://nim-lang.org/docs/manual.html#foreign-function-interface-byref-pragma Nim manualではbyref pragmaがForeign function interfaceの章の下にある。 つまりbyref pragmaはC/C++の関数に引数をポインタ渡ししなきゃいけないときに使うもの。 それ以外のときに使う必要性はほぼ無いってこと。 >>273 10kバイト以上のでかいobjectをたくさん使うとかならスタックを使わないようにref objectにしてヒープに確保してもいいと思う。 けどそんなにでかいobject型のローカル変数をたくさん使うことってあんまりないきがするけど。 たとえば https://qiita.com/dumblepy/items/8d13592d6760d0155d89 >オブジェクトの宣言にはref objectを使います。 >Nimでは関数の引数に入れられた変数の容量に応じてコンパイラが自動で値渡し/参照渡しを調節しますが、 >これは挙動の予測が付かずバグの原因になりえます。 >ref objectでオブジェクトを宣言していれば必ず参照渡しになるので、 >アプリケーション開発ではこちらに統一しましょう。 みたいなことが 問題無い訳ではないとも https://flat-leon. はてぶろ.com/entry/nim_arg_pass バージョンや記事の年代に気を付けないといかんのかね >>270 それは var の説明であって ref の説明ではないですね >>275 >>278 refのついた型またはvar引数は常に引数を参照渡し(ポインタのコピー)する。 refやvarがついてない場合は引数のサイズにあわせてコピー渡しか参照渡しになるが、どちらにせよプロシージャ内で引数を変更するのは禁止 だからデフォルトの引数の渡し方でそれがコピー渡しになろうが参照渡しになろうがそれで挙動が変わったりバグの温床になることはない。 ただしaddrとかemit, Assembler statementなどのNimが安全性を保証してない機能を使う場合は例外だ。 参照とか reference とか同じ名前だから混同してるのかも知れないが Nim の参照型と C++ の参照型は全く別物 C++ の引数で使う参照型 & は Nim では var の方が近い Nim の ref は C++ ではポインタ * と思った方が良い Nim では GC で管理されるポインタが ref GC で管理されないポインタが ptr これ使うか使わないかでも全然違うのよね --gc:arc Nim2では--mm:orcがデフォルトになるらしいぞ。 みんな知ってると思うけど--mm:arcだともし循環参照があったときにメモリリークするぞ。 >>275 のリンク先なんか 「Nimでアプリケーション開発をするための設計のベストプラクティス」 みたいにイキってるけど 信用していいの? object type 全部 ref 付けろ教のひと たまにいるよね 迷惑 なんでもかんでもref付けろと しつこく強要してる人は あたまおかしい 大抵は{.byref.}で用足りる {.byref.}はnimからC/C++の関数を使うときに引数をポインタで渡しているときに使うもの。 それ以外では使う意味はないよ。 Nimはちゃんと最適な方法で引数を渡すから必要でもないのに{.byref.}とかvarとかつける必要はない。 var も ref も byref も全部別物だと何度言えば判るんだ? >>293 みんなが必ず遭遇する問題なので 短くまとめて次スレからテンプレにするのが良い 以下 >>293 のテンプレが続く {.byref.}をrefと間違うのは判らんでもないし同情するが {.byref.}をvarと間違う香具師は初めて観た nim 1.6.10 出た 1.6.98 まで行くのかw >>297 Nimでは正規表現よりPEGのほうがおすすめらしい。 https://nim-lang.org/docs/pegs.html PEG (Parsing expression grammar) is a simple deterministic grammar, that can be directly used for parsing. The current implementation has been designed as a more powerful replacement for regular expressions. UTF-8 is supported. pythonのStringIOとかBytesIOみたいなのは無い? https://nim-lang.org/docs/streams.html を観ると FileStream = ref FileStreamObj ← 判る FileStreamObj = object of Stream ← 判らん StringStream = ref StringStreamObj ← 判る StringStreamObj = object of StreamObj ← 判る Stream = ref StreamObj ← 判る StreamObj = object of RootObj ← 判る なんで FileStreamObj = object of StreamObj になっていないのでしょう? 意図を知りたいです https://github.com/nim-lang/Nim で lib/pure/streams.nim の type を観ても FileStream のだけ FileStream* = ref FileStreamObj FileStreamObj* = object of Stream でした 命名の推測で「WHY?」という話なら、ofキーワードの後に来るのが、必ずxxxObjという規約ではないから。 目的としてxxxObjでないのは、それを扱いやすくするためでStringStreamやStreamはそのまま宣言したり 引数に渡したり、戻り値の型として記述して使用するのに対してxxxObjは普通にライブラリの使用者は めったに直接的に使用しない。(ライブラリの設計者・実装者は普通に使う) 例を言えば、MemMapFileStream、ReadSocketStreamなども利用者は直接的に使用するが、いずれも ストリーム系だがobject of の後にくるものは違う。 例えば、利用者はプロセスの出力をStreamで使用するなら、このようなprocを使う proc outputStream*(p: Process): Stream これを、クライアントプログラムの実装者が受け取る変数の定義でStreamObjと書いていたらおかしい。 APIドキュメントには、「最も使用される一般名称にはそのままの名前を付ける」としか書いてないが Nimに限らず一般的に、1つか少数の抽象名と数多くの具象名は一般名称でプレ・サフィックスは付けない https://nim-lang.org/docs/nep1.html When naming types that come in value, pointer, and reference varieties, use a regular name for the variety that is to be used the most, and add a "Obj", "Ref", or "Ptr" suffix for the other varieties. If there is no single variety that will be used the most, add the suffixes to the pointer variants only. The same applies to C/C++ wrappers. 似た話にxxxRefがあるがこちらはref objectに単に付けるが、型名をあまり使用しない場合で、なおかつ ref objectであることを強調する場合が多い。 StringTabeRef* = ref StringTabeObj var tbl = newStringTable(...) https://play.nim-lang.org/#ix=4hrl 継承するときに基の型についてるrefは無視されるようなので objectかref objectのどちらから継承しているかは重要ではないようだ。 template とか macro とか使うと 流れる様にさらさら描けて気持ち良いわコレ templateとmacroを上手くに使えるようになりてえなあ☹ こんな感じのmacroを書いていろんなコードを与えてみよう。 コンパイル時にecho x.treeReprの出力が表示される。 それを読めばNimのコードはAST(抽象構文木)になることが理解できると思う。 これがNimのmacroを理解する第一歩だと思う。 import std/macros macro test(x: untyped): untyped = echo x.treeRepr test: echo "test" 後はこれを読めばok https://nim-lang.org/docs/manual.html#macros https://nim-lang.org/docs/macros.html macro は AST 知ってると有利だね あと head と body を受け取るタイプのと node を受け取るのと static type を受け取るのとか 区別して理解しないと 自分が何やってるのか判らなくなる 直交性という言葉を知ってるオジサン・・・ C/C++言語の#def, #include→別言語(直交性100%)、錆びのprintln!→実は別言語(直交性100%) むしろこれは言語が習得で異なる仕様の言語を2つ覚えないといけない、敷居を高くする欠点 NimNodeはseqに近い方法で扱えるようにmacrosモジュールにプロシージャが定義されているのはいいことでは。 今はNimNodeじゃなく、quote do:で書くのが良いよな。どうしてもNimNodeじゃなきゃ書けないマクロもあるだろうけどね もう2.0かよ(´・ω・`)公開してるライブラリ大丈夫かな バージョンが大きく変わって大丈夫と思う方が 無理がある Nim言語を使っていても特につまづくことがないから話題があんまりないんだよね。 初心者はys3mとかrs3mで十分 Ziicubeでys3m出た 1割引き価格後の値段 679円 マグネット 1151円 Maglev 1623円 Boall-Core https://www.ziicube.com/Moyu-333-HuaMeng-YS3M この言語ってRustみたいにプログラマに押し付けるmutなんて使ってないのに、なんでいわゆるMove操作が勝手に出来るの? 説明しろください! Nim良いよね Rustは宣伝がうざいだけだが Nimは判ってる人の間でまったり進化してくれ 公式読めばだいたいのことはわかるから特にここでも議論は出ないよね 唯一日本語の書籍がもう一冊くらい欲しいなあくらい 夜遅くにすいません。 SyntaxHilighter用のNim Brushってどっかにありませんか? >>343 ごめんなさい。 SyntaxHighlighter でした。 >>344 SyntaxHighlighter っていうのがよくわからないけど VSCode拡張とかのこと? >>345 えぇエ~それぐらいネットで調べ「てく」ださいよ~~。 伝えるのめんど「い」し、説明上手くないからネッ-トで調べた方が絶対%絶対%にわかると思うんですよね。 お願いしますよ~~ Nim言語はコンパイル時にreadFileとwriteFileを使えるんだけどコンパイル時にファイルを読み書きできるプログラミング言語ってあまりないんじゃないか? staticExecていうコンパイル時にコマンドを実行できるプロシージャもあるし。 どっかで既出かもしれんけど、結局VSCの拡張は何入れれば安牌? 初めてお邪魔します 下のスレッドでフィボナッチ数列(回帰関数)のベンチマークをやったのですが Nim 2.0がダントツの速さでした 原因が分かる方、教えていただけますでしょうか、よろしくお願いいたします Qiita 3 - キータぞ、来たぞ、キータだぞー https://mevius.5ch.net/test/read.cgi/tech/1685235361/368-371 https://mevius.5ch.net/test/read.cgi/tech/1685235361/373-375 上記スレ、fibonacci(44)の計算、抜粋 Nim(44はコマンドライン引数) https://wandbox.org/permlink/WoYP0STRKxaRBGCY >Time= 0.240s Result=701408733 C/gcc(44はソース直書き) https://wandbox.org/permlink/9OYZBH14tYooZHF7 > Time: 0.89583 seconds C/clang(44はソース直書き) https://wandbox.org/permlink/U97PecZYrzymnfH4 >Time=1.58712s Result=701408733 >>353 Nimでコンパイルするときに'--listcmd'オプションを与えるとNimがgccを呼び出すときにどんな引数を渡しているか表示されるようになります。 もしかすると凄く最適化されるようなオプションを渡しているのかもしれません。 >>354 早速の回答ありがとうございます wandboxのspeedだとO3が見られたので、nim.cfgに gcc.options.speed = "-O2" を追加してついでに-d:ltoも外しました Nim 2.0.0 + gcc 12.2.0(-O2) --verbosity:2 --listcmd --passL:-s (strip symbols) https://wandbox.org/permlink/RVJ4eHKKl5DARK3u >CC: prog.nim: /opt/wandbox/gcc-12.2.0/bin/gcc -c -w -fmax-errors=3 -O2 -I... >Hint: /opt/wandbox/gcc-12.2.0/bin/gcc ... -lm -lm -lrt -s -ldl [Link] >Hint: mm: orc; opt: speed; options: -d:danger >Time= 0.274s Result=701408733 >Time= 0.252s Result=701408733 >Time= 0.251s Result=701408733 >Time= 0.250s Result=701408733 >Time= 0.250s Result=701408733 今度は確実に LTO無し gcc -O2 になりましたが、実効速度はダントツに速いままでした 何か気が付く点がありましたらまた今度教えてください (私の方は今日は限界です...) >>355 Nim言語が高速なのはC言語コードを吐き出した時に 再帰処理をgotoループに置き換えている可能性があります その場合C言語のオプションをいくら変更してもあまり意味はない です 確認はコマンドライン引数に --nimcache:.cache を加えて コンパイルして.cacheフォルダ内のC言語ファイルを確認すれば わかるはず nim c --nimcache:.cache -d:release ... -d:relsese の部分は -d:danger で 置き換え可能で dangerのほうが高速です 詳細はここ https://nim-lang.org/docs/nimc.html コンパイル型言語のベンチを取る時は再帰処理コードは 避けた方が良いと思います >>356 追記 末尾再帰になっている可能性もありかな Nimコンパイラ自体は再帰関数の最適化はしてなかったと思う。 gccは再帰関数をループに置き換えているかもしれないからその確認をしたかったら-S -masm=intelを付けてアセンブリコードを出力させて読んでみよう。 >>356 変換キャッシュの見方、ありがとうございます >再帰処理をgotoループに置き換えている可能性があります 確認したところ、置き換わっていませんでした >コンパイル型言語のベンチを取る時は再帰処理コードは >避けた方が良いと思います ↑ここ詳しくお願いします >再帰処理をgotoループに置き換えている ↑こうなっていませんでしたが、これ前提での話だったのですか? 再帰fibonacciは個別の言語コンパイラ(更にバージョン)の 最適化ベンチマークには持って来いに見えますので >>358 >Nimコンパイラ自体は再帰関数の最適化はしてなかったと思う。 その通りでした 確かめたところ二つの再帰関数コールがそのまま残っていて、 その他はNimのトランスパイル過程でのノイズがあるだけです gccがノイズを消すために最適化を頑張った結果、Cより速くなったのですかね 何気にNim + gcc HEADにしてみたら、更に速かったです Nim 2.0.0 + gcc 12.2.0 -O2 (44はコマンドライン引数) https://wandbox.org/permlink/RVJ4eHKKl5DARK3u >Time= 0.250s Result=701408733 これ↑がこう↓ Nim 2.0.0 + gcc HEAD 14.0.0 -O2 (44はコマンドライン引数) https://wandbox.org/permlink/cpYesJtnlRNJiu7Z >Time= 0.197s Result=701408733 参考値再掲(>>353 ) C/gcc -O2 (44はソース直書き) https://wandbox.org/permlink/9OYZBH14tYooZHF7 > Time: 0.89583 seconds C/clang -O2 (44はソース直書き) https://wandbox.org/permlink/U97PecZYrzymnfH4 >Time=1.58712s Result=701408733 gccの最適化が凄すぎて意味わからないですが、ありがたく享受する事にします レバテックωωω Rust in Nim out ωωωωωω >>349 F#が、 F# Dataってライブラリで、コンパイル時に ファイルの読み取りは、やってたけれど、あまり見かけないね。 >>363 Rustのメモリ安全性はボローチェッカーによって担保されているが、 Nimと比較してRustはタイプ量が多い事により限りなく低い生産性と C++のような高い難読性、超巨大なバイナリ生成性能を兼ね備えています Nimはバージョン1.5.1でRustのボローチェッカーに似た「View types」が実装されれば、 GC無しのView typesで参照の有効性を検証することによってメモリ安全性を保証しつつ 限りなく抑え込まれたタイプ量で高速化したCのソースコードを吐き出せます Nimソースコード ==nimコンパイラ==> Cソースコード ==Cコンパイラ==> バイナリ なので、nimコンパイラが通った時点でメモリ安全性が担保されませんか? Nimの実験的特徴 バージョン1.5.1 http://nim-lang.github.io/Nim/manual_experimental.html 第二プログラミング言語として Rust はオススメしません Nim をやるのです https://wolfbash.hateblo.jp/entry/2017/07/30/193412 Nimは限りなく抑え込まれたタイプ量で高い生産性とPythonのような高い可読性を実現し ているにもかかわらず、高速なCのソースコードを吐き出せるのでC言語でリモートワーク されている方は割り振られた仕事が早く終わっても終わってないふりをして怠けることができる 「怠け者とはこうあるべきだ!」と言うとても大事な事を Nim は我々に教えてくれます Nim って python を強調し過ぎてるのはミスリードだと思うな python と相性が良いってのは事実だけど Nim の特徴のほんの一部でしかない >>366 Python使える人が多いからNimを広めるためにNim言語はpythonと同じだという人は多い。 文法がpythonに近いだけで中身は静的型言語だからpythonよりC++とかRustに近いと思う。 pythonしか知らない人がNimのオーバーロードとかGenericsとかobjectとref objectの違いとかちゃんと理解して使えるのかどうか心配になる。 「文法がpythonに近い」が事実じゃないんだよな 観た目が似てるだけであって文法が似てる訳じゃない 全然別物 そういう意味では構文で結構損してそう オフサイドルールが気に入らない人にとってはそもそも検討に値しないし Python好きな人ならそこは気にならないだろうけど、別に移行しやすくもない >>369 でも静的型言語でオフサイドルールの言語はNimとcrystal以外あまりないのでは。 オフサイドルールが好きで型システムがちゃんとしていて高速に動くプログラムを書きたい人にはぴったり。 型で安全性を静的に担保したいと考える人が、同時にインデントで意味が変わってしまうオフサイドを好むってのはちぐはぐさを感じる HaskellとデフォルトF#もオフサイドルールありですね。どうせインデントするんだしって使ってやれってくらいの感じなのかね? あとは、インデントに意味はないけれど、goが標準のフォーマッタでインデント入れてくるね。 Python登場当時だと{}前後のどこで改行するか論争みたいなのがあったりして確かに括弧書くのが面倒な空気はあったんだよな それがGo/Rustの世代だと言語標準のフォーマッタが勝手にやってくれるってなって めんどくさくないっていうオフサイドのメリットはなくなってしまった そうすると自動フォーマットしづらいとかコピペしづらいとかデメリットばかり目立つことになってしまう ブロック毎に'{}'や行末に';'があるとソースコードが少し汚く見えるし 無いとすっきりして読みやすいと思うけどね。 まぁ人によるんじゃない 自分は{}がある方がブロックの識別性が良くて読みやすい オフサイドは特にネストしたブロックの戻りが何段戻ったか見づらいんだよな カッコありなら、lisp系が好き。 悩む事が減る。 >>374 セミコロンはオフサイドルールじゃなくてもRuby/Go/Kotlin/Swiftのように無しできるから関係ないよね それにセミコロンをタイプするのは面倒だとは思うが慣れると読む時のノイズにはならない 自然言語の文章で句点やピリオド+改行がノイズにならないのと同じこと CやC++を10年以上使っていたけど';'や'{}'が無いほうがすっくりして読みやすいと思うから慣れでどうにかなるものでは無いと思う。 こういうのは個人差があるのかもしれないが ttps://github.com/jeetsukumaran/vim-indentwise このVimのプラグインを使うと同じインデント間のカーソル移動、異なるインデント間のカーソル移動が簡単にできるからお勧めです。 >>379 CやC++やっててそんなこと言うやつ初めて聞いたぞ 本当に日々コード書いてる? そりゃ仕事で使える言語でオフサイドルールなのってPythonくらいだし ほんとはオフサイドがいいけどC/C++の仕事してるって人くらいいるでしょ >>382 {}や;がノイズになるかどうかと オフサイドがいいかどうかの話は別だよ >>381 今はC/C++殆ど書いてないけど以前はほぼ毎日使ってたよ。 {}や;に慣れてもやっぱり余計な文字が少ない方がすっきりして読みやすいと思うのだが、そういう人は少数派なんかな? 主観で読みやすいかどうか力説しても結論でるわけない オフサイドは誤ってインデントずれても気付かないままになってしまうのが問題 >>384 まぁ実際オフサイド採用の新規言語ってあまり出てこないし 少数派なんじゃないかな f#みたいに、使う側が選択できれば、解決なんじゃない? >>384 どちらの方がすっきりして読みやすいかと {}や;が思考ノイズになるかどうかは別だよ 前者はそれなりにいる 後者はツチノコレベルで稀有 エディタの色設定で{};を薄い色にすればいいだけやん {}がノイズになるようなら:や=はもちろんのことblock:なんて発狂ものだろうからNimは無理やろな 思考ノイズって エロい事連想してるって意味だよな? Nimってオフサイドルール以外の所は目立った欠点の無い言語なんかな。 それに実際にオフサイドルールでコードを書いていて困ったことないし。 インデントがずれても困るという人はインデントの幅をスペース4個とか広めにすればいいのでは オフサイドルールは欠点だらけ Pythonを例にすると - カットペーストは命がけ - ネット等で共有しにくい - テキストエディタやIDEの支援が激弱 - dedentは手動タイピング必須 - 改行のために追加の()や\が結局必要 - インデントだけでは可読性が低いから余計な:が必要 - 空行の数まで厳密に意識する必要もある - lambdaのone expression縛りのように言語の成長を阻害しやすい - “explicit is better than implicit”と言いながらブロックはimplicit Vim使ってるけどコピペは問題無くできるしインデントの深さもブロックごと'>'で調整できる。 vim-indentwiseでブロック毎カーソル移動可能。 スペース一個分だけでインデントするとかしない限りブロックの開始、終わりは前後の行のインデントの位置の違いでわかる。 vim-indentwiseでカーソル移動すればブロックの範囲も簡単にわかる。 以前はC/C++を書いてたけど{}や;が無くて読みづらいとか書きづらいとか思ったことは無いよ。 Nim書いていて改行のために追加の()や\が必要になることはほぼ無い 空行の数を厳密に意識する必要もない。 Nimを実際に書いたことあるの? https://wandbox.org/permlink/Nfe6exUFmtWPdWZj NimのAnonymous proceduresでは複数行書けるし こうしてコードを共有できてる。 >>398 でもアロー関数にすると()を追加するなどしないと1行しか書けなくなる これもオフサイドルールのせい しかもこんな明らかなバグでも修正しようともしない 言語の成長を阻害するとはこういうこと >>397 論点理解せずにvim使いなら誰でも知ってる基本を必死に解説されても困るわ >以前はC/C++を書いてたけど{}や;が無くて読みづらいとか書きづらいとか思ったことは無いよ。 {}や;が無くて読みづらいとか書きづらいとか誰もそんなこと言ってないだろ? 勝手に脳内変換するなや ついでに言うとセミコロン無い方が書きやすいのは当たり前のこと だから新しい言語の多くがセミコロンレスを採用してる(オフサイドは採用しないけど) >>399 アロー関数ってNimのsugarモジュールにある`=>`マクロのこと? あくまでこの=>は二項演算子だから両辺は式になっていないといけない。 オフサイドルールに関係無く二項演算子の両辺に文を直接書けず式を置かないといけないのは殆どのプログラミング言語で同じじゃない? 複数文を書きたければanonymous procedureで書けばよいし。 オフサイドルールじゃない言語で無名関数に複数文を書くときは必ず{}で囲む必要があるし。 どうしてこれが言語の成長を阻害していることになるの? 明らかなバグなのに修正しようとしないって言うけどGithubのNimのリポジトリにそういうissueある? 無名関数を書くときはdo notationというのもあるよ。 https://nim-lang.org/docs/manual.html#procedures-do-notation 「vimを使えばいい」とか「無名関数を使えばいい」などと列挙されても 他の言語はそんな特別なケアなしに使えるわけでな… このあたりがいまいち広まらない原因なんじゃない? >>402 現代では高機能なテキストエディタやIDEが使えるから それを使うことを前提にプログラミング言語をデザインしたらいいんじゃね? って話は聞いたことがある。 sugarの`=>`マクロはNim言語のanonymous procedureを特定の条件下で簡単に書けるよう作られたもので完全にanonymous procedureを置き換えられるものでない。 sugarモジュール自体がシンタックスシュガーのようなものを提供するマクロなどを集めたものだし。 制限とか気にせずにanonymous procedureを書きたかったら=>を使わずに書くしかない。 >>404 そのへんがまさに省略記法の悪い点が出てる感じするな 省略するってことはソースコードの情報量は減っていて、それはタダではない 「OOのときにはXXを使う」みたいな規則がたくさん発生するというコストがあるんだよね これはセミコロンレスもそうで、時々変なエッジケースが発生したりする オフサイドルールと違ってセミコロンレス(optional semicolon)は多くの言語で妥当なトレードオフ オフサイドルールが妥当なトレードオフとして成立してるのはHaskell系の言語くらい なんかどうでもいいことをいつまでも うじうじと 気に入らないなら使わなきゃいいだけ 気に入ったら使えばいいだけ >>407 気に入っていても: ある日突然: 気に入らなくなる事ってあるよね? 気に入らなくても: ちょっとしたきっかけで: すごく気に入ってしまうことも あるよね? そういう時はどうすればいいの? >>408 > すごく気に入ってしまうことも > あるよね? Error: invalid indentation Nimはよく考えずに機能追加して既にC++並みに複雑化してる 目新しさだけで飛びつくと後悔するぞ 議論をよく読めば何やらちゃんと考えて実装しているらしいのはC++も同じなんだよなあ >>415 単純に >>410 への反論なだけじゃない? Rust言語はトヨタ自動車が採用してると どこかで読んだ プログラムをビルドするためにC++だったらCMake、Rustだったらcargo.tomlにTOMLを使う。 Nimだったらconfig.nimsも.nimbleファイルもNim言語で書ける。 一つの言語でコンパイル言語としてもスクリプト言語としても使えて便利。 Nimはマクロやconstなどをコンパイル時に実行するためにVM使ってるんだけど、そのVMを使ってNimをスクリプト言語のように実行できるらしい。 rustも複雑なことをしようと思ったらbuild.rsに書けるけど、それはそうとして依存関係をプログラム言語で書きたいかと言われると あれもこれもできて便利!みたいなのはぱっと見良さそうでも 大規模・多人数・長期開発になると負債になりがちではある procとmethodとfuncを使い分けつつ{.global.}や{.async.}なとの{.pragma.}とmacroでぐちゃぐちゃにかき混ぜられるのが超エレガントw 他の言語では類を見ない read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる