Closed k-yamada39 closed 1 year ago
stiilton 上で test.lmn を
{ test. }. test.
として,
slim -t --nd --use-builtin-rule test.lmn
とすると,
States
1::{{}. }
Transitions
init:1
1::
'# of States'(stored) = 1.
'# of States'(end) = 1.
となる.
slim --dump-json -t --nd --use-builtin-rule test.lmn
のように,json を dump する形式であれば下記のようにきちんと出力される.
States
1::{"id":5,"name":"","atoms":[{"id":6,"name":"test","links":[]}],"membranes":[{"id":7,"name":"","atoms":[{"id":8,"name":"test","links":[]}],"membranes":[]}]}
Transitions
init:1
1::
'# of States'(stored) = 1.
'# of States'(end) = 1.
a. {b }.
でも同様の結果になる.
dumpの形式を指定しない場合,lmn_dump_cell_internal()
内の以下の部分
https://github.com/lmntal/slim/blob/c3c95f9ae2c0de5e9e9eb119caafc53ee559f716/src/vm/dumper.cpp#L637-L640
でrecord_flag
が0以外の値になっているため,出力から省かれているようです。LmnSymbolAtom
構造体の定義では,
https://github.com/lmntal/slim/blob/c3c95f9ae2c0de5e9e9eb119caafc53ee559f716/src/vm/atom.h#L137-L142
のようにfalse
で初期化されています。alloc.cpp
で
https://github.com/lmntal/slim/blob/c3c95f9ae2c0de5e9e9eb119caafc53ee559f716/src/element/alloc.cpp#L64-L78
のように,ヒープからメモリ領域を割り当てたときにrecord_flag
を初期化していないために,問題が発生しているのかもしれません。
JSONでdumpする場合,lmn_dump_cell_internal()
の代わりにlmn_dump_mem_json()
が呼ばれていて,こちらではrecord_flag
は参照していないようです。
lmn_new_atom()
のreturn文の前にap->record_flag = false;
と付け足すと,とりあえずはきちんと出力されるようになりました。
上で議論されている解決方法を実装しました.
以下のプログラムのように、膜の内外にリンクを含まないアトムのみを置いた状態で、--ndオプションと--use-builtin-rule を付けて実行すると、出力される結果にそれらのアトムが表示されないことがあります。 アトムの他にルールを書いた場合、そのルールの発火などは問題なく起きているようなので、表示上の問題と思われます。
{ test. }. test.