论坛首页 编程语言技术论坛

ruby可以做嵌入语言不

浏览 9151 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-08-08   最后修改:2011-08-08
这两天需要一个小的语言来解释一些古怪东西,要求是,用脚本A中读入一些全局的函数和变量,然后在脚本B中执行这些函数和变量。比方说

脚本A中有  OS="WIN7"


在脚本B中可能会执行:

case(OS)
  when "WIN7":
     ///
...

这样的需求,在javascript中,可以通过jsruntime, jscontext和jsobject来和其他脚本做沟通,但是我找不到ruby中有context这样的东西,可以让我把全局函数和变量放进去让脚本B用...(IronRuby的DLR context是可以做到这个的),是我弄错了吗?
   发表时间:2011-08-08  
嗯当然可以嵌入用。有些游戏引擎还就是拿Ruby当嵌入脚本用的。
老文章例如这篇 http://metaeditor.sourceforge.net/embed/
没有Context之类的对象,你需要的是一些全局函数。嗯这也是MRI不适合嵌入的一个方面 = =
0 请登录后投票
   发表时间:2011-08-08  
这个需求不能用eval么?
PC = Struct.new(:os, :memory, :cpu)
pc = PC.new("WIN", "4G", "XXX")
pc.instance_eval("os == 'WIN' or memory == '2G'")
0 请登录后投票
   发表时间:2011-08-08  
QuakeWang 写道
这个需求不能用eval么?
PC = Struct.new(:os, :memory, :cpu)
pc = PC.new("WIN", "4G", "XXX")
pc.instance_eval("os == 'WIN' or memory == '2G'")



Ruby的感觉就是有点dirty,只有一个Context,啥都往里头扔。。。
0 请登录后投票
   发表时间:2011-08-08  
RednaxelaFX 写道
嗯当然可以嵌入用。有些游戏引擎还就是拿Ruby当嵌入脚本用的。
老文章例如这篇 http://metaeditor.sourceforge.net/embed/
没有Context之类的对象,你需要的是一些全局函数。嗯这也是MRI不适合嵌入的一个方面 = =



没有Context对象,基本MultiThread就玩不动了,看来C族嵌入式语言还是基本该用lua和js啊。
0 请登录后投票
   发表时间:2011-08-08  
ruby里一切都是对象,你一定要这种形式的话,可以如此实现:
class Object
  OS = "WIN7"
end

case(OS) 
  when "WIN7":
    puts "hi"
  else
    puts OS
end
0 请登录后投票
   发表时间:2011-08-09   最后修改:2011-08-09
另外,关于运行平台检测我觉得应该这样写:

module OS
  # why not using RUBY_PLATFORM: http://blog.emptyway.com/2009/11/03/proper-way-to-detect-windows-platform-in-ruby/
  require 'rbconfig'
  HOST_OS = Config::CONFIG['host_os']
  class << self
    def is_mac?
      HOST_OS =~ /darwin/
    end

    def is_windows?
      HOST_OS =~ /mswin|mingw/
    end

    def is_linux?
      HOST_OS =~ /linux/
    end    
  end
end

OS.instance_eval do
  case
  when is_mac?
    puts "MAC"
  when is_windows?
    puts "WIN"
  else
    puts "unknow: #{OS::HOST_OS}"
  end
end

0 请登录后投票
   发表时间:2011-08-09  
rainchen 写道
另外,关于运行平台检测我觉得应该这样写:

module OS
  # why not using RUBY_PLATFORM: http://blog.emptyway.com/2009/11/03/proper-way-to-detect-windows-platform-in-ruby/
  require 'rbconfig'
  HOST_OS = Config::CONFIG['host_os']
  class << self
    def is_mac?
      HOST_OS =~ /darwin/
    end

    def is_windows?
      HOST_OS =~ /mswin|mingw/
    end

    def is_linux?
      HOST_OS =~ /linux/
    end    
  end
end

OS.instance_eval do
  case
  when is_mac?
    puts "MAC"
  when is_windows?
    puts "WIN"
  else
    puts "unknow: #{OS::HOST_OS}"
  end
end




....这个貌似没啥关系。。我只是随手举个例子而已
0 请登录后投票
   发表时间:2011-08-09  
通常都是起个新解释器进程, 用环境变量设置环境, 用管道传输代码和输出, 各解释器间有公共代码的就fork ... 如果满足不了你的需要, 还是用 lua 吧.
0 请登录后投票
   发表时间:2011-08-09   最后修改:2011-08-09
night_stalker 写道
通常都是起个新解释器进程, 用环境变量设置环境, 用管道传输代码和输出, 各解释器
间有公共代码的就fork ... 如果满足不了你的需要, 还是用 lua 吧.



俺的脚本引擎为要UI线程服务的哈。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics