Skip to content

mdwagner/luajit.cr

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

luajit.cr

LuaJIT bindings for Crystal

Installation

  1. Install LuaJIT

  2. Add the dependency to your shard.yml:

dependencies:
  luajit:
    github: mdwagner/luajit.cr
    version: ~> 0.4.0
  1. Run shards install

Windows

Simple

  1. Run .\scripts\build.ps1 to install to ext\luajit directory

Example (powershell):

.\scripts\build.ps1
# ...build output...
crystal run src\example.cr

Advanced

If you would rather Bring-Your-Own-LuaJIT, the following changes must be made:

  • Add LuaJIT directory to environment variable CRYSTAL_LIBRARY_PATH
    • NOTE: make sure to still include Crystal's compiler directory as well (can be found by running crystal env CRYSTAL_LIBRARY_PATH)
  • Add LuaJIT directory to PATH
    • This isn't completely necessary, but if you plan to leverage -Dpreview_dll it's required

Usage

require "luajit"

# Basic Hello World
Luajit.run do |state|
  state.execute! <<-'LUA'
  print("Hello World!")
  LUA
end

# Crystal type to Lua object
class Account < Luajit::LuaObject
  def_class_method "new" do |state|
    _self = new
    Luajit.setup_userdata(state, _self, self)
    1
  end

  def_instance_method "deposit" do |state|
    _self = Luajit.userdata_value(state, self, 1)
    value = state.to_i(2)
    _self.deposit(value)
    0
  end

  def_instance_method "withdraw" do |state|
    _self = Luajit.userdata_value(state, self, 1)
    value = state.to_i(2)
    _self.withdraw(value)
    0
  end

  def_instance_method "get_balance" do |state|
    _self = Luajit.userdata_value(state, self, 1)
    state.push(_self.balance)
    1
  end

  property balance : Int32 = 0

  def deposit(value : Int32)
    self.balance += value
  end

  def withdraw(value : Int32)
    self.balance -= value
  end
end

Luajit.run do |state|
  Luajit.create_lua_object(state, Account)

  state.execute! <<-'LUA'
  local account = Account.new()
  account:deposit(2000)
  account:withdraw(100)
  assert(account:get_balance() == 1900)
  LUA
end

Development

  • LuaJIT bindings
  • Works on Windows (+build script)
  • Safe wrappers
  • Better tests
  • Better docs + readme
  • Crystal to Lua object wrapper

If you encounter any bugs, feel free to open an issue!

Contributing

  1. Fork it (https://github.com/mdwagner/luajit.cr/fork)
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create a new Pull Request

Contributors