鄭です。

NAGAI Hidetoshi writes:
 > 永井@知能.九工大です.
 > 
 > >>>>> "T" == TEI meiki <tei / harmony.co.jp> writes:
 > T> またまた Ruby/Tk で助けて下さい。
 > T> Sun Solaris 2.5.1 の CDE 環境では、フォント名に
 > T> -dt-interface user-medium-r-normal-m*-*-*-*-*-*-*-*-*
 > T> などという途中にスペースを含んだ名前が標準で使われています。
 > 
 > あちゃ〜.
 > tkfont.rb を書いてた時は,この case については頭にありませんでした.
 > 対策をちょいと考えてみますが,今,忙しいので時間がかかるかもしれません.
 > 応急としては,問題となっている tk_split_list(str) を
 > tk_split_simplelist(str) に置き換えて試してみていただけませんか.

だめでした。

考えた挙げ句、Tcl/Tk(私は Tk4 しかしらないのですが) の configure の
帰り値は、外側の 1レベルのブレースは、リスト構造をくくり、
さらにその内側のブレースは、文字リテラルだろうと決めうちして
tk.rb の tk_split_list(str) を、ブレースをどこまでリスト構造と扱うかの
上限値の引数を追加してみました。

--- tk.rb-org	Tue Sep  1 15:50:29 1998
+++ tk.rb	Mon Oct 19 12:45:09 1998
@@ -62,6 +62,8 @@
     when /^\./
       Tk_WINDOWS[val] ? Tk_WINDOWS[val] : _genobj_for_tkwidget(val)
     when / /
+      # これは必要か??? 
+      # 上で  if val.include? ?\s しているから不要のような気がするが?
       val.split.collect{|elt|
 	tk_tcl2ruby(elt)
       }
@@ -72,6 +74,8 @@
     end
   end
 
+if nil
+# 以下 tk_split_list(str) オリジナルコード
   def tk_split_list(str)
     return [] if str == ""
     idx = str.index('{')
@@ -96,6 +100,43 @@
     list += tk_split_list(str[i+1..-1])
     list
   end
+end
+
+# 以下 tk_split_list(str) テストコード
+  def tk_split_list(str, maxnest = nil, nest = 0)
+    str = str.strip
+    return [] if str == ""
+    result = []
+    while str.length > 0 
+      if str[0] == ?{ then
+	i = 0
+	brace = 1
+	str[1..-1].each_byte {|c|
+	  i += 1
+	  brace += 1 if c == ?{
+	  brace -= 1 if c == ?}
+	  break if brace == 0
+	}
+	result << str[0..i-1] # 先頭の '{' はまだ残しておく。
+	str = str[i+1..-1].strip
+      else
+	i = str.index(" ") || str.length
+	result << str[0,i]
+	str = str[i+1..-1].strip
+      end
+    end
+    result.collect{ |element|
+      if element[0] == ?{ then
+	if ! maxnest || maxnest > nest then
+	  tk_split_list( element[1..-1], maxnest, nest+1 )
+	else
+	   (element == "{") ? [] : element[1..-1]
+	end
+      else
+	tk_tcl2ruby(element)
+      end
+    }
+  end
 
   def tk_split_simplelist(str)
     return [] if str == ""

そして、tkfont.rb の init_widget_font を以下のようにしてみました。

--- tkfont.rb-org	Tue Sep  1 15:50:29 1998
+++ tkfont.rb	Tue Oct 20 05:55:47 1998
@@ -64,7 +64,7 @@
   def TkFont.init_widget_font(path, *args)
     case (Tk::TK_VERSION)
     when /^4\.*/
-      conf = tk_split_list(tk_call(*args))
+      conf = tk_split_list(tk_call(*args),1)
       if font_inf = conf.assoc('-font')
 	ltn = font_inf[4]
 	ltn = nil if ltn == []
@@ -81,7 +81,7 @@
       TkFont.new(ltn, knj).call_font_configure(path, *(args + [{}]))
 
     when /^8\.*/
-      conf = tk_split_list(tk_call(*args))
+      conf = tk_split_list(tk_call(*args),1)
       unless font_inf = conf.assoc('-font')
 	raise RuntimeError, "unknown option '-font'"
       end

とりあえずこれでなんとなく動いているのですが、、ほんとうにこれで
いいのでしょうか?  (^_^;;

ところで、このあいだも書きましたけど tk.rb の TkObject#method_missing で、

  def method_missing(id, *args)
    name = id.id2name
    case args.length
    when 1
      configure name, args[0]
      self  # これを追加
    when 0
      fail NameError, "undefined local variable or method `#{name}' for #{self.to_s}", error_at
    else
      fail NameError, "undefined method `#{name}' for #{self.to_s}", error_at
    end
  end

と、self を返すようにすると便利な気がするのですが、だめでしょうか?
>まつもとさん、その他 tk*.rb の関係者のみなさん。

-- 
                         ┌─鄭  明毅───────────────────┐
                         └──tei / harmony.co.jp──tei / mirage.linc.or.jp─┘