やりたかったことに手がつけられたのでうれしい。

しー言語とリフレクションライブラリ

適当にデモ言語を作りました。

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
なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h