まくろちゃれんじ!setf編(第五+3/4話)
setfのLisp内での定義を知ることが出来れば作ることも容易になるだろうと思い、GCLのソースを見てみた。
setf.cなんて言う、そのまんまなファイルを見つけた。
どうやらソース自体はC言語らしく、残念ながらLispでの定義を見ることは出来ないみたいで残念だ。
とは言え、その作りを見ることが出来ればきっと何かしら得るものがあるだろう。
と思い、
ざっと見てみた↓
T13:; if(endp(cddr(base[3]))){ goto T17;} base[4]= VV[9]; vs_top=(vs_base=base+4)+1; Lerror(); vs_top=sup; T17:; V7= cadr(base[3]); goto T9; T11:; V7= Cnil; T9:; V8= list(4,VV[2],/* INLINE-ARGS */V6,V7,VV[10]); base[4]= list(7,VV[0],VV[1], /* INLINE-ARGS */V3,/* INLINE-ARGS */V4, /* INLINE-ARGS */V5,/* INLINE-ARGS */V8, list(2,VV[3],base[2])); vs_top=(vs_base=base+4)+1; return; T2:; base[4]= cadr(base[3]); vs_top=(vs_base=base+4)+1; Llist_length(); vs_top=sup; V9= vs_base[0]; if(number_compare(V9,small_fixnum(1))==0){ goto T21;} base[4]= VV[11]; vs_top=(vs_base=base+4)+1; Lerror(); vs_top=sup; T21:; V10= list(2,VV[3],base[2]); V11= list(4,VV[2], /* INLINE-ARGS */V10,list(2,VV[3],base[3]),VV[13]); V12= list(3,VV[5],list(2,VV[3],base[2]),VV[14]); V13= list(3,VV[5],list(2,VV[3],base[2]),VV[15]); V14= list(2,VV[3],base[2]); V15= (*(LnkLI93))(cddr(base[3])); V16= list(4,VV[2], /* INLINE-ARGS */V14,/* INLINE-ARGS */V15,VV[16]); base[4]= list(7,VV[0],VV[12], /* INLINE-ARGS */V11,/* INLINE-ARGS */V12, /* INLINE-ARGS */V13,/* INLINE-ARGS */V16, list(2,VV[3],base[2])); vs_top=(vs_base=base+4)+1; return;
…無いわ。これは無いわぁ…。
何このGOTOラベルの嵐は?何このラベルの名前は?自動生成されたソースですか?
しかもこのファイル、2000行もあるよ?
setf関連だけで、2000行もあるよ?
むり。
これは、むり。
ソースは読めません。