しー言語とリフレクションライブラリ
適当にデモ言語を作りました。
http://shinh.skr.jp/koneta/shelang.tgz
スクリプト言語からコンパイル言語の処理を呼ぶ時は、どうしてもブリッジを書くのが面倒で死にたくなります。そこで、 C で関数名から動的に関数を呼んでやろうという試みです。
puts "hello world!" !load "libm.so" fx = cosf 3.2 puts "cosf(3.2) =" !print fx
こんな感じで .so ファイルをスクリプトからロードして、ロードされたシンボルをそのままスクリプトからそのまま呼び出せる物体です。
libbfd で実行時にシンボルを取ってこれると教えてもらったため、それを使ってやっています。高林さんの普通のやつらの下を行け や 鵜飼さんの livepatch を参考にしています。特に livepatch はソースも相当流用させてもらいました。詳しくは中身の README に。
言語としてどうこうしようとかはあんまり考えてません。 Io から C の関数呼び出しまくりな世界は作りたいなーと思っています。
あと mapファイルが無くても動く reflection.d も作りたいなーと思っています。
ちなみに下記のように SDL なんかも動きます…
!load "/usr/local/lib/libSDL.so" SDL_Init 1048608 # SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE pscr = SDL_SetVideoMode 100 100 16 0 prwf = SDL_RWFromFile "icon.bmp" "rb" pbmp = SDL_LoadBMP_RW prwf 1 SDL_UpperBlit pbmp 0 pscr 0 # assume int == void* SDL_FreeSurface pbmp prwf = SDL_RWFromFile "out.bmp" "wb" SDL_SaveBMP_RW pscr prwf "out.bmp" SDL_Flip pscr SDL_Delay 1000 SDL_Quit