タグ

ブックマーク / qnighy.hatenablog.com (5)

  • 安定化間近!Rustのimpl Traitを今こそ理解する - 簡潔なQ

    概要: impl Trait が安定化間近である。これはトレイトオブジェクトと似た用途を持つが、静的ディスパッチされSizedのまま使えるため効率的である。 impl Trait が安定化間近 Rustでは新規の機能はまずnightlyバージョンに「不安定機能 (unstable feature)」として取り入れられます。そこでの実験を経て、プログラミング言語Rustに半恒久的に導入してもよいと合意されたものだけが「安定化 (stabilize)」され、betaやstableバージョンのコンパイラでも使用できるようになります。 さて、現在 「impl Trait」と呼ばれる機能の安定化のめどがたったというアナウンスがありました。この機能は2016年夏ごろに実装され、長い間待ち望まれてきた目玉機能のひとつでしたが、ここにきてようやっと、という感じです。そこで、 impl Trait について

    安定化間近!Rustのimpl Traitを今こそ理解する - 簡潔なQ
  • Rustでグラフを表現するにはTyped Arenaが便利 - 簡潔なQ

    概要: Rustでグラフのように相互参照を含むデータ構造を表現するには、Typed Arenaという方法が適している。これについて説明する 整数による表現 グラフの表現方法で、最も簡単なのは、ノードを整数で表し、グラフのデータを別に持つ方法である。 fn main() { let mut edges = vec![vec![]]; edges[0].push(0); edges.push(vec![]); edges[1].push(0); } これは大抵どんな言語でも同じように使えるし、場合によってはこちらで済ませてしまったほうが簡単かもしれない。特に競技プログラミングではノードに付与されている情報が少なかったり、ノードに明示的に整数が付番されていたりするため、ほとんどの場合整数で表現するほうが扱いやすい。 しかしこの方法では、整数とグラフデータとの対応関係を見失いやすいと考えられる。整

    Rustでグラフを表現するにはTyped Arenaが便利 - 簡潔なQ
  • Rustのマングリング(名前修飾) - 簡潔なQ

    Rustの生成したネイティブコードを見ると、 _ZN6thread5sleep20h87eee61de4645181cAbE のようなシンボル名が見える。この例は std::thread::sleep に対応している。このようにRustの(単相化された)アイテム(関数や変数など)の名前をリンカが認識できる文字列にエンコードする処理はマングリングと呼ばれている。 Rustのマングリングは一見してわかるようにC++互換になっている。実際に上の関数をデマングルすると $ c++filt _ZN6thread5sleep20h87eee61de4645181cAbE thread::sleep::h87eee61de4645181cAb と、それらしき名前が出てくる。 しかし、これは表層上C++互換になっているというだけで、Rustのマングリングの質はこのハッシュ部分 h87eee61de464

    Rustのマングリング(名前修飾) - 簡潔なQ
    Nnwww
    Nnwww 2017/03/19
    C++とのFFIライブラリがあるので気になっていましたが、マングリングに互換性があったんですね
  • combine: マクロのいらないRustのパーサーコンビネーター - 簡潔なQ

    はじめに Rustには有名なnomというパーサーコンビネーターライブラリがあるが、せっかく高級な型システムと最適化があるのにマクロで何とかしようとするのは勿体無いと思うので、マクロに深く依存しないcombineを使ってみた。 combineの主な特徴 parsec リスペクトのパーサーコンビネーター コンビネーターはマクロではなく、 Parser traitを実装する値で表す バイトストリーム、文字(Unicodeコードポイント)ストリーム、トークンストリームの全てに対応 メモリ上の文字列だけではなく、入力ストリームからの直接のパースにも対応 まだ計測はしていないが、 Box を多用していたりはしないので、速度的に大きく遅れをとるようなことはないのではないかと思う。 以下、parsecについて知っていたほうが読みやすい構成になっているので、必要ならparsecの資料を探して読むといいかもし

    combine: マクロのいらないRustのパーサーコンビネーター - 簡潔なQ
  • OCamlのformat (型安全なprintf/scanf) の仕組み - 簡潔なQ

    OCamlのPervasives (デフォルトでopenされるモジュール) には、Printf/Format/Scanfで使うための format という型がある。 OCamlの特殊機能として、型推論時に文字列リテラルにstringではなくformatという型がつくことがある。 $ ocaml OCaml version 4.04.0+dev2-2016-04-27 # "%d";; - : string = "%d" # ("%d" : _ format);; - : (int -> 'a, 'b, 'a) format = CamlinternalFormatBasics.Format (CamlinternalFormatBasics.Int (CamlinternalFormatBasics.Int_d, CamlinternalFormatBasics.No_padding, C

    OCamlのformat (型安全なprintf/scanf) の仕組み - 簡潔なQ
  • 1