●●●●TCL/TKなら俺に聞け 2●●●●at TECH
●●●●TCL/TKなら俺に聞け 2●●●● - 暇つぶし2ch262:デフォルトの名無しさん
08/05/29 20:12:22
Tcl/Tk 8.5でBLT-2.4z使えてる方はいらっしゃいますか?

パッチとか修正とか、かなり手を入れないと使えないのでしょうか。

263:デフォルトの名無しさん
08/06/02 21:39:25
>>239
ここにその議論がある。URLリンク(wiki.tcl.tk)
要するにsplitすればよい。ただし連続する空白文字に対する動作が意図と異なるかもしれない。
while {[gets $ch line] >= 0} {
puts [lindex [split $line] 0]
}

あるいは、
puts [join [split $line] |]
などに書き換えて様子を見よう。

>>262
Windows版の場合、tcl84.dllに直接リンクしてしまってるからどうにもならないよね。
Tcl8.3あたり以降のextension作成のガイドラインから外れた古い作りになっているんだろう。
実際何年も更新されてないようだし。
自前ビルドしてやるしか。

264:262
08/06/03 11:42:06
>>263
URLリンク(jos.decoster.googlepages.com)
を基に試してみました。

demosやexamplesの一部 (多く?) が失敗するけど、なんとなく使えそうです。
BLT-3.0で対応するのかなぁ。

265:デフォルトの名無しさん
08/06/14 18:22:11
URLリンク(reddog.s35.xrea.com)
これは試した?

266:262
08/06/16 16:43:53
後出しでごめんなさい。Linuxです。
Fedora 9で試してまして、そうこうしてるうちに、>>263の方法で対応したパッケージがリリースされました。

URLリンク(bugzilla.redhat.com)
で対処してくださったようです。

267:デフォルトの名無しさん
08/06/20 19:54:08
tk でコンボボックスの幅を指定するにはどうすればいいでしょうか?
また、できれば選択した文字列が表示されるテキストボックス部分を
複数行表示にしたいのですが、可能でしょうか?

268:デフォルトの名無しさん
08/06/20 21:03:00
>>tk でコンボボックス
tile拡張のttk::comboboxのやつか?
ttk::combobox .cb -width 100 とかでいけんじゃね
>>複数行表示にしたいのですが、可能でしょうか?
不可能じゃね

269:デフォルトの名無しさん
08/06/27 03:20:15
質問があります。

set a hoge
set b a
set c b

とやって、cからたどってhogeに辿り着くには
どうすればいいのでしょうか。
$$$c とか $[$[$c]] とかいろいろやってみたのですが
できません……。

270:デフォルトの名無しさん
08/06/27 22:53:22
set a hoge
set b a
set c b

proc aho foo {
upvar $foo bar
return $var
}

puts [aho [aho $c]]


271:デフォルトの名無しさん
08/06/27 23:22:33
>>269
puts [set [set $c]]
>>267
2行は無理。BWidgetsのコンボを改造すればできるかも


272:デフォルトの名無しさん
08/06/28 00:44:17
>>271
へ~、setって変数の参照にも使えるんだ。 勉強になりますた。

273:デフォルトの名無しさん
08/06/28 03:31:47
>>263
> ただし連続する空白文字に対する動作が意図と異なるかもしれない。

この制約がどうにも辛いです。
連続した空白があってもそれをただ一つの区切りとみなしつつ、
安全にファイルなどから読み込んだ文字列を処理するには
どうしたらいいのだろうか。

274:269
08/06/28 04:50:38
>>270
>>271
ありがとうございます。

275:デフォルトの名無しさん
08/06/28 06:01:58
>>273
そんなの教わったregsub使えよ
while {[gets $ch line] >= 0} {
puts [lindex [split $line [regsub -all -- {\s+} $line { }]] 0]
}

276:デフォルトの名無しさん
08/06/28 12:50:19
>>273
set line {He said "I am}
foreach word [string map {\" \\"} $line] {
puts $word
}

277:デフォルトの名無しさん
08/06/28 14:34:54
>>276
'{' inside string

278:デフォルトの名無しさん
08/06/28 17:20:38
文字列の中に"や{がある事を気にする必要がある時と
必要がない時の条件がよく分からん。。。
あと、ファイルから読み込んだ行を一律regsubしてしまって
常に構わないのかどうかも。。。

279:デフォルトの名無しさん
08/06/28 21:56:13
>>278
文字列をリストに自動変換してるところは気にしろ。文字列をforeachしたり
リスト系のコマンドに直接文字列を渡したりしてるところは注意だ。
>>276
set line "He said \"I am \{ a boy \}"
foreach word [string map {\" \\\" \{ \\\{ \} \\\}} $line] {
puts $word
}

280:デフォルトの名無しさん
08/06/28 23:10:12
> \} \\\}
これは必要? あってもなくても同じではないの?

281:本田
08/07/01 06:46:34
>Tcl/Tk 8.5.3 June 30, 2008
>Tcl/Tk 8.6a1 June 25, 2008
>Tcl/Tk 8.4.19 Apr 18, 2008
URLリンク(www.tcl.tk)

282:263
08/07/02 07:53:23
>>273
そもそもの話をしてもいいだろうか。
こんなコードは試しましたか?


set lines {He said "I am
a boy"}

set i 0
foreach l $lines {
puts $i:$l
incr i
}

Tclのlist「形式」は平易ながらバイナリデータまで扱える立派な「データ構造」なので、
まともに実装しようとすればTclが最初から持ってるパーサーを実装しなおすようなことになるよ。

平易ではあるがあまり(書いたソフトの)ユーザーには触ってもらいたくないデータ形式のような気がする。
コメントも使えないしね。自分自身で読み書き保存するためにはいいけど、
ユーザーに触らせるならJSONやYAMLなどのより一般的な形式がいいだろうね。
今ならtcllibのCVS HEADにライブラリが置かれてるよ。

283:239
08/07/02 09:03:58
なんか、今頃また盛り上がってるが・・・

>>282
それじゃ根本的に違うんだよね~
getsで一行ごとにテキストファイルから読んでるの文字列に「"」があるのがミソなんで

set lines {He said "I am}

を処理することになるんですよ。


284:デフォルトの名無しさん
08/07/02 19:51:00
8.5から文字列をリストに変換できるかどうかチェックする
string is list $strが追加されてんぞ。

285:デフォルトの名無しさん
08/07/03 00:00:27
info completeで失敗したら、さらに1行読み込んでappendすりゃいいだけだろ
そもそもデータ自体が1行ずつ処理されるように書かれていないのになぜ、1行ずつ
処理したがるのか

286:デフォルトの名無しさん
08/07/03 01:29:08
ファイルの文書が、必ずしも""の対応関係があっている保障はないわけだが。

287:デフォルトの名無しさん
08/07/03 01:43:11
たしかにそういうこともあるな
flex/bisonでやるか PureTclでやるならfickle/taccle


288:デフォルトの名無しさん
08/07/04 11:09:03
canvasにarcなどを1000個くらい書くと激重でどうしようもありません。
自分の描画ルーチンが重いのではなく、Tkがcanvasをリフレッシュするのが激重です。
描画したアイテムを選択して移動とかするつもりはなく、単に絵が表示されればいいのですが…
こんな場合は、image photoに直接力技で図形を書いていくしかないですかね。

289:デフォルトの名無しさん
08/07/05 12:36:31
Tkのキャンバスウィジェット並みの機能ってほかのGUIフレームワークにないですかね。
書いた絵をドラッグできるとかそういう系。

290:本田
08/07/06 13:21:30
>>289
Zinc Is Not Canvas!
URLリンク(www.tkzinc.org)

OpenGLが、速い環境が無いと、遅すぎてかなわん。

291:デフォルトの名無しさん
08/07/07 21:37:10
Zincもええが、tkpathの方がシンプルでとっつきやすいよ

292:デフォルトの名無しさん
08/07/08 00:37:16
tkpath使ったら早くなるかとおもったけど全然早くならなかった・・・


293:デフォルトの名無しさん
08/07/09 07:59:32
>>288
>>292

1000を超える描画単位(図形やウィジェットなど)をリアルタイムで取り扱うことはスクリプト言語系のツールキットでは想定されてないと思う。
素直にネイティブコードで動く言語で実装したほうが早いんじゃない? 描画結果のキャッシュでもしつつ。

294:デフォルトの名無しさん
08/07/09 20:18:40
いやまだ手はある。Tcl3DでOpenGLで直接描画すれば・・・!

295:デフォルトの名無しさん
08/07/09 22:18:26
マルチスレッド拡張使ってる人いる?

296:デフォルトの名無しさん
08/07/09 23:06:43
ときどき使う。

297:デフォルトの名無しさん
08/07/09 23:44:51
>>296
非同期で走っている複数のスレッドから進行状況や終了などをメインのスレッドで
受け取るにはどういう手段があるんでしょう? tsv でスレッド内で状況をセットして
メインでpollするというぐらいしか思いつかないのですが。 メインの方で
vwaitしてスレッドのほうからthread::sendなんて出来ませんよね? 


298:デフォルトの名無しさん
08/07/10 06:48:22
C++などで書いてるソフトにTclのインタプリタを組み込んでるやつはいないだろうか。
Tcl_Eval()でTclスクリプトを実行したときにそのスクリプトにエラーが含まれていると、
エラーメッセージはResultの中に入ってる。
これをResultの代わりにエラー出力に出したいんだが、その方法がよくわからない。
やり方があるようなら教えてもらえないだろうか。

299:297
08/07/10 06:54:59
あ、だめだ。 これ以前にExpectがthread-safeで無くてスレッドからは使えないとか。 
Expectを多用してるので諦めます。

URLリンク(community.activestate.com)

300:本田
08/07/10 07:54:03
stderr
URLリンク(wiki.tcl.tk)
stderr is one of the stdio output files opened
- applications and functions tend to use it for the output of error messages.

301:298
08/07/10 10:32:22
>>300
ご協力ありがとう。
読んでみたけどどうやらこれはTclインタプリタ側(Tclスクリプト側)から
外部コマンドを呼び出したときのstderrについて議論しているみたいで、この話とはちょっと違う。

Tcl_CreateInterp()でinterpを作った後、
Tcl_SetStdChannel(channel, TCL_STDOUT);
Tcl_SetStdChannel(channel, TCL_STDERR);
を呼び出すことでinterpが呼び出すputsコマンドによる標準出力、エラー出力をトラップできることは確認できている。

だがTcl_Eval()やその他のTcl変数を直接いじるAPIを呼び出したときの文法エラー、実行時エラーは出力されないみたいなんだ。
(で、Resultの中に入っている)
こいつを、他と同じようにトラップできればいいんだが……。

302:デフォルトの名無しさん
08/07/10 11:44:58
>>297
>>299
URLリンク(www.tcl.tk)

303:デフォルトの名無しさん
08/07/10 14:59:25
>>301
TCL_ERRORだったらResultを出力すればいいだけじゃね?

304:デフォルトの名無しさん
08/07/10 22:13:52
>>298
なんでそんなことそをする必要があるかもう少し詳しく書いた方がいいぞ。そうしないと、
>>303みたいにすりゃいいだろ思うんだが
if (Tcl_Eval(interp, script)!=TCL_OK) {
char str;int len;Tcl_Channel e=Tcl_GetStdChannel(TCL_STDERR);
str=Tcl_GetStringFromObj(Tcl_GetObjResult(interp), &len);
Tcl_Write(err,str,len);Tcl_Flush(interp,err);
}


305:304
08/07/10 22:23:39
あー、どうでもいいけど、Tcl_WriteObjつかうと、Tcl_GetObjResultから一発で済むわ。

306:本田
08/07/22 20:12:44
TkSTEP 0.3b3 (Tk 4.1)
NEXTSTEP(tm)-lookalike-wanabee-hack-kit for Tk
Alfredo K. Kojima
tkstep0.3b3.tar.gz
tkstep8.0.4-2.tar.gz

Alfredo Kojima
URLリンク(en.wikipedia.org)
Alfredo Kengi Kojima
URLリンク(si3.inf.ufrgs.br)

TkSTEPは、現在、開発がストップしてるけど、
windowmakerなど他の仕事で作者は有名なんだな。

307:本田
08/07/23 01:18:22
The Tcl IRCd
URLリンク(www.hping.org)
The Tcl IRCd is an IRC server written in the Tcl language.
The current version is not a complete implementation of the IRC protocol
but should interoperate well with most IRC clients, and allows to register,
change nick, create channels, talk on a public channel or in query and so on.
The program is small,
less than 500 lines of code, and was written in order to be very simple to modify/extend.

308:デフォルトの名無しさん
08/07/24 04:12:37
string hoge とかって具合に 任意の string * コマンド(?)を追加したりはできないでしょうか。

309:デフォルトの名無しさん
08/07/24 20:37:58
proc stringHello {} {puts "HELLO WORLD"}

set map [namespace ensemble configure string -map]
dict append map hello stringHello
namespace ensemble configure string -map $map

string hello


ただし8.5以上。

8.4のときはstringコマンドをtcl_stringなんかに名前を変えて
そのうえでそれのラッパーのstringを作ったりしてた。

310:デフォルトの名無しさん
08/07/24 23:57:42
>>269
>$$$c とか $[$[$c]] とか…
puts [subst $[subst $[subst $c]]]

遅レスだが…

311:デフォルトの名無しさん
08/07/27 18:35:14
>>269 & >>310
$$var (間接指定)について
URLリンク(psg.com)
に丁寧な説明がある。
古い我家頁だが、今でもアクセス可能と思う。



312:デフォルトの名無しさん
08/07/29 00:59:08
BrowseX for Windows使ってた人いない?
いきなり消滅してて悲しい・・・

313:デフォルトの名無しさん
08/08/02 08:48:51
Active Tcl やっと8.5.3になった

314:デフォルトの名無しさん
08/08/05 04:33:00
tclコードをソース隠ぺいのため、バイナリ化または、
暗号化したいがどうすればよいでしょうか?

315:デフォルトの名無しさん
08/08/05 21:26:28
バイナリ化(exe化)ならここに色々ある。
URLリンク(home.netyou.jp)
隠ぺいのためになるかは不明.


316:デフォルトの名無しさん
08/08/11 10:37:56
comポートとかソケットをopenで開いてgetsした時、
相手が何も返してこないと、一生待ちつづけてしまうのですが、
タイムアウトさせたりする方法は無いですか?

317:デフォルトの名無しさん
08/08/12 07:07:15
>>316
Tcllibは調べた?

318:デフォルトの名無しさん
08/08/12 08:05:26
>>316
fconfigure -blocking
fileeventで非同期に処理するのが良いと思う


319:デフォルトの名無しさん
08/08/13 20:58:56
>>316この手のシークエンスを記述するためにafter ms命令が用意されている

320:316
08/08/14 09:50:55
>>318
fileeventがまさに探していた機能です
サンクスコ

>>319
それは考えたけど、一度発行したgetsを取り消す術がないからダメポ

321:デフォルトの名無しさん
08/08/24 00:56:41
foreach {o i } [regexp -all -inline {<item>(.*?)</item>} $read] {
のlsearchとかlreplaceとかで、ネストタグの抽出が簡単にできるのが良い。
perlより全然良い。日本語が問題なく使えるのが良い。簡単GUIも良い。
foreachの中のregexpが速ければもっと良い。なかなか最適化ができない。





322:デフォルトの名無しさん
08/08/24 01:10:16
tclの正規表現は早いほうって聞いたけどなあ・・・

323:デフォルトの名無しさん
08/08/24 02:59:06
Tclで書いたスクリプト自体はそれほど早く動作しないよね。
TclはJITに対応してるという記述がちらほら(wiki.tcl.tk含む)で見かけたので
ソースコードを調べたら、スクリプトを内部表現に書き換えるコンパイラはあっても
CPUのニーモニックに直接変換してる実装部分は見当たらなかった。

インタプリタ自体がやってることはそれほど複雑ではないので(ほとんどがコマンド自体の実装)
誰か実装してくれればいいなとは思うが、
googleのannualのフォーラムでの議題には特にあがっていないようだ。

324:デフォルトの名無しさん
08/08/24 09:13:12
速くしたけりゃその部分だけCで書け
そもそも
コマンド 引数 引数 ...
しかなくて、構文などというものもない簡易言語に期待しすぎでしょ。


325:デフォルトの名無しさん
08/08/24 22:12:31
その理屈で言うと括弧しかなくて構文などというもののない簡易言語にも期待できないのか。
それはさておきTclでバイトコードコンパイルしてるってのだけで驚異的じゃない?
Tclって意味論的には素直に考えるとevalに満ち溢れたような代物でしょ。

326:デフォルトの名無しさん
08/08/25 00:18:54
インタプリタ作ったり、DLLやsoを簡単にロードできたり、Cとの融合が十分考慮されてる言語なんだから、
処理速度を要求される部分はCで作った方がいいでしょ、マジで。

327:デフォルトの名無しさん
08/08/25 01:11:39
別にそこには反論してないよ。
それはTclのシンタクスとは直接の関係はないし、Tclが簡易言語とも思わないけど。

328:デフォルトの名無しさん
08/08/26 00:03:21
stdinを1文字単位で扱いたいのですが・・可能ですか?
Enter押すまで入力待ちになってしまいます。
機種依存が必要であればlinuxでお願いします。
proc getch {} {
return [read stdin -nonewline]
}
目的は簡易lessコマンド作成です。

329:デフォルトの名無しさん
08/08/26 00:10:49
>>327
tclはねぇ、ローカルスコープ切れないからちょっとプロシージャが長くなると変数がゴッチャになるのよ。
長いもの書くには向かないと思うがね。

330:デフォルトの名無しさん
08/08/26 00:44:05
zero3 [es]でeTcl使ってるんだけど・・・バージョン進むにつれてサイズでかくなりすぎ。
最新版はついに起動できなくなったwww
動的に拡張を読み込めるのがTclの利点なのに、一つの実行形式に使わない拡張までまとめないで欲しい・・・

331:デフォルトの名無しさん
08/08/26 01:37:04
>>329
Tclなめんな!

proc block {body} {
    eval $body
}

set x 100
set y 1000
block {
    set x 200
    upvar y y
    puts "value is $x $y"; # value is 200 1000
}
puts "value is $x $y"; # value is 100 1000

332:デフォルトの名無しさん
08/08/26 01:41:54
>>328
URLリンク(wiki.tcl.tk)
まあこれを読め

URLリンク(tcllib.sourceforge.net)
そして次はこれだ

333:デフォルトの名無しさん
08/08/26 03:33:43
>>332
ありがとうございます。
解決しました!

334:デフォルトの名無しさん
08/08/26 17:03:54
>>331
blockがたくさんネストしたらどこまでupvarしたらいいかわかんなくなっちゃうね。

335:デフォルトの名無しさん
08/09/08 13:49:03
日本語に関して質問です。
encoding systemがwindowsではcp932, Linuxではutf-8となっていて、
スクリプトを書くさいにそれぞれの文字コードで保存せねばなりません。
(string bytelengthはいずれの環境も一緒になるので内部ではutf-8のようですが)
ですので、windowsで作ったスクリプトをそのままLinuxに持っていくと文字化けしてしまい困っております。

encoding systemをcp932やutf-8に強制的にセットしたところで上手く動きません
(windowsでencoding system utf-8にし、スクリプトをutf-8で保存しても文字化け、等)

encoding systemの異なる環境間で同一スクリプトで動かす手立てはないものですかね。

336:デフォルトの名無しさん
08/09/08 20:35:03
Unicodeリテラルで書く。

337:デフォルトの名無しさん
08/09/10 03:14:41
>>335
もし8.5を使ってるんだったら、、sourceやtclshやwishに-encodingオプションが付いたから、
スクリプトはcp932で書いておいて、最初の3行を

#!/bin/sh
# the next line restarts using tclsh \
exec tclsh -encoding cp932 "$0" "$@"

にすることで、できたりしませんか?

逆に、スクリプトはutf-8で書いておいて、
windowsの関連付けの方で、wishに -encoding utf-8を付けるという手もあるかも。

試せないので、無責任に書きっぱなしですいません。


ところで、スクリプトをwindowsからLinuxへ持っていくときに
nkf通して変換というのじゃ駄目なんでしょうか。

338:デフォルトの名無しさん
08/09/10 07:12:11
>>335
shift-jisで書いておいて
#!/bin/sh
# \
LANG=ja_JP.SJIS; export LANG; # \
exec tclsh "$0" "$@"

で動くかもしれないし、動かないかもしれない。

339:335
08/09/10 10:06:33
>>336
よくわかりません。

>>337
8.4使っているのですいません。
(ActiveTclの拡張が8.5では少なすぎるので)
Linux側で修正したりwindows側で修正したりしたのを日付で同期してるのでnkfやiconvは使いにくいですね。

>>338
凄いぜ。
putsでターミナルに出力する文字は化ける(konsoleのモードがutfだからしかたない)が、
widgetに出力する文字はきちんと出たよ~。


340:デフォルトの名無しさん
08/09/10 20:07:26
>>339
puts \u0055\u0069\u0063\u006f\u0064\u0065\u30ea\u30c6\u30e9\u30eb\u304f\u3089\u3044\u3050\u3050\u308c

341:150.29.213.49 335
08/09/10 21:37:28
>>340
それはさすがに嫌杉でしょw

342:デフォルトの名無しさん
08/09/10 23:21:08
>>339
putsは fconfigure stdout -encoding utf8 とかで化けなくなると思う。
でも、そこまで文字コード意識するならWindows<->Linuxでコピーする時に変換するほうが良いんじゃないの?

最近ActiveTcl8.5.4に乗り換えたけど一見拡張が入っていないように見えて、実は Tcl\lib\teapot\package\ 以下に
入っているように思った。

343:デフォルトの名無しさん
08/09/11 21:48:49
>>341
この技はおぼえておけ。かならず役に立つときが来る。

344:デフォルトの名無しさん
08/09/12 22:20:20
>>339
>>342
ActiveTcl8.5.x のインストーラの最初の画面で、

8.5は8.4とほとんど互換性があるから、
teacupを使うか8.4に上書きインストールしたら
たくさんのパッケージが手に入る。

というようなことが書いてました。
まだ8.5に乗り換える気はないんで、それだけ見てキャンセルしたけど。

345:デフォルトの名無しさん
08/09/17 02:39:50
>>331
>>334
見つかるまでさかのぼるupvarを書いてみました。
upvarが上位の変数名とローカル変数名を並べて書くのに対し、
上位の変数名だけ並べて書いて同じ名前でリンクするようにしてます。

proc upvar2 {args} {
  set leveldepth [info level]
  foreach varname $args {
    for {set varlevel 2} {$varlevel <= $leveldepth} {incr varlevel} {
      if {[uplevel $varlevel info exists $varname]} {
        incr varlevel -1
        uplevel 1 upvar $varlevel $varname $varname
        break
      }
    }
  }
}


346:デフォルトの名無しさん
08/09/19 21:57:20
windows mobile でeTcl使ってプログラム作ってたらメモリが足りなくて死んだorz
image photoって、-paletteで色数制限しても内部はフルカラーメモリ展開するのね。
やっぱ、WMで使うには富豪過ぎるか、Tclはorz

347:デフォルトの名無しさん
08/10/16 04:52:51
内部イテレータ欲しい

348:デフォルトの名無しさん
08/10/27 13:15:30
Tclを久しぶりに書いてみたら、firefox用のpluginが正常にインストールできません。
どういう状況なのでしょうか?ご存知でしたら教えてください。



349:デフォルトの名無しさん
08/10/27 15:39:46
>>348
スネーク。状況をもう一度よく確認するんだ。

Tcl → バージョンが上がらない
Firefox → バージョンあがりまくり

放っておかれたアドオン(plugin)はどうなる?

350:デフォルトの名無しさん
08/10/28 07:20:41
>>348
了解

メインバージョンが上がらないと更新されない訳ですね。

351:デフォルトの名無しさん
08/10/31 16:09:38
300Kbyte程のTclTkを書いてみた。
っかZETってソフトのちょい変だけど。

URLリンク(carnageez.web.fc2.com)


352:デフォルトの名無しさん
08/10/31 22:10:52
10秒見ただけだが、名前空間使わずによくこんだけ書いたな

353:デフォルトの名無しさん
08/11/01 05:18:31
>>352
名前空間って何?( ゚д゚)ポカーン

354:デフォルトの名無しさん
08/11/01 05:45:22
>>353
URLリンク(www.tcl.tk)

355:デフォルトの名無しさん
08/11/01 07:09:06
>>354
ありがと。
へえーーなんちゃってオブジェクト化って感じなんだね。

356:デフォルトの名無しさん
08/11/01 09:51:35
Tcl 8.5からapplyコマンドでラムダ式とかが使えるらしいんだけど、
なんか入門的な情報ない?


357:デフォルトの名無しさん
08/11/01 16:24:05
set lis [another commend]
for e $lis { something $e }
とかやらずに、$lisに直接何かを作用して写像を得たり、
フィルタリングできるの?

358:デフォルトの名無しさん
08/11/01 22:49:17
初心者すぎてすいません。
tclのproc関数の出力をtkのテキストに書き出すにはどのようにすれば
いいのでしょうか?
いまいちtclとtkの連携方法がわからず困っています。


359:デフォルトの名無しさん
08/11/02 02:01:41
んと、こんなんやってる
set str "hogehoge"

f_text_update $str

proc f_text_update {win str}
if {![winfo exists $win]} {
text $win
grid $win -column 0 -row 0
}
$win delete 0.0 end
$win insert end $str
}

360:デフォルトの名無しさん
08/11/02 02:12:55
んもしや回答を誤ったか?

f_text_update [f_proc_func]

proc f_proc_func {} {
return "hogehoge"
}

これでどうだ

361:デフォルトの名無しさん
08/11/02 06:25:56
>>359-360
ありがとうございます。
試してみます!!

362:デフォルトの名無しさん
08/11/05 11:35:53
>>356
この記事は読んだ?
URLリンク(wiki.tcl.tk)

363:デフォルトの名無しさん
08/11/05 23:30:13
λx.λy.x(2)(3)
みたいなことをやろうとして、
apply {{x} {return [apply {{y} {return x}} 2]}} 3
てやっても
x
が返ってくる。
で、
apply {{x} {return [set [apply {{y} {return x}} 2]]}} 3
ってやれば3が帰ってくるが、setを使っている時点で2回目のapplyの戻り値が変数名であることを前提にしていて気持ち悪い。



364:デフォルトの名無しさん
08/11/08 14:38:54
ツール組込みのtcl環境でもlambda使いたい

365:デフォルトの名無しさん
08/11/10 23:01:54
>>363
こりゃーいったい何をやろうとしとんじゃ?return xで
文字列のxが返るのはあたりまえじゃないか

366:デフォルトの名無しさん
08/11/11 14:14:10
>>365
単に$のつけ忘れじゃ?


ついでに質問。
{}内の変数は置換されないよね?
そうすると、applyの引数にとる関数にはその引数で宣言した変数しか出てこれない。
これだと、例えば「xを引数にとって、『引数yをとって、yとxとの和を求める関数』を返す関数」とかが表現できない気がするんだけど…
""だとyが束縛されてないし…無理矢理置換するしかない?

367:デフォルトの名無しさん
08/11/11 20:25:25
答えると、Tclにはクロージャ無いねん。
だからxを置き換えるしかないんじゃないかなあ。

set func {x {return [list y [list expr $x + \$y]] }}
apply [apply $func 1] 2
3

こういうこと?

368:デフォルトの名無しさん
08/11/12 00:20:16
>>365
λx.λy..x
=λx.x
でしょ。
こうならないってこと。

369:デフォルトの名無しさん
08/11/12 08:27:21
>>368
> >>365
> λx.λy..x
> =λx.x
> でしょ。

そんなequalityを持つλ計算の体系は見たことが無い

370:デフォルトの名無しさん
08/11/14 22:42:02
結局なんだったんだ。もう

371:デフォルトの名無しさん
08/11/15 10:04:27
>>370
同感

372:デフォルトの名無しさん
08/11/15 10:11:42
点が余計に入った
λ.x.(λy.x)は変換するとλx.xだろうと。

373:デフォルトの名無しさん
08/11/15 18:14:51
>>372
お前が前提にしているλ計算の公理系を言え。
通常のβη変換ではλx.(λy.x) = λx.xは導出できない。

374:デフォルトの名無しさん
08/11/30 09:35:24
Tcl and the Tk Toolkit, Rough Cuts, 2nd Edition
* By John K. Ousterhout, Ken Jones
URLリンク(www.informit.com)

ついこの前プレンティスから出てる妙に読みにくいTcl本買った俺涙目

375:デフォルトの名無しさん
08/11/30 19:08:03
日本語で良書なTcl本ってなにがあるかな

376:デフォルトの名無しさん
08/12/01 20:34:12
ものすごいつまらんこと聞いていいっすか?

Tclって、pythonで言うところのinputとかraw_inputって無いの?

377:デフォルトの名無しさん
08/12/01 22:11:19
gets

378:デフォルトの名無しさん
08/12/02 09:18:28
>>376
pythonで言うところのinputって何をするものか書いたほうがアドバイスもらえると思うが?

379:376
08/12/02 20:46:30
>>378
それもそうですね。失礼しました。自分は職業プログラマではな
いのであんまりうまく説明できそうにないですが。。
webで見つけた説明によれば、

raw_input関数
標準入力から1行読み込んで(末尾の改行をのぞいたものを)文字列に変換して返す。

>>> s = raw_input()
test
>>> s
'test'

とこんな感じです。上記はインタプリタでの動作です。
呼ばれると、ユーザの入力を待つモードになります。
ユーザが文字列を入力すると変数に文字列が代入されます。
input関数は数値入力用です。

380:デフォルトの名無しさん
08/12/02 20:56:09
やっぱgetsでいいじゃん

tclsh>gets stdin s
test
tclsh>puts $s
test


381:379
08/12/02 23:32:57
>>380
レスありがとうございます。

getsにはそんな風に書くんですね。
channelIdってのが何を指してるのかサッパリでした。。

明日会社に行ってまた試してみます。
たまーに仕事用ツール作成でスクリプト書くんですが、
諸事情あって今回はTclにで書いていて。。

382:デフォルトの名無しさん
08/12/04 00:53:01
scan $str "%s,%s,%s,%s" a b c d
とかもあるよ。scanfみたいなの。
また正規表現を使った読み込みとか便利
set fp [open $fname]
gets $fp str
regexp {\[\s*\s*\]\s*(\w+)} $str d1 d2とかね

以下が改行取って読み込みとか
set fp [open $fname];gets $fp str
foreach i [split $str "\n"] {

}
以下とかするとバイナリファイルも開けるよ
set fp [open $fname]
fconfigure $fp -translation binary
binary scan [read $fp 1000] H* str


383:デフォルトの名無しさん
08/12/04 22:00:38
binary scanとbinary formatの使い方をすぐ忘れちゃうのは秘密だ

384:デフォルトの名無しさん
08/12/04 22:04:45
>>375
Tcl/Tkデスクトップリファレンスには超おせわになった。
あとEffective Tcl/Tk。この2冊はTcl/Tk修行時代の
10年位前にかなり読んだ。

385:デフォルトの名無しさん
08/12/10 21:58:58
Tcl初心者です。すみません、教えて下さい。

ビルトインコマンドにラッパーをかける事は
できるのでしょうか。

例えば

proc wrapper {cmd} {
catch {eval {$cmd}} status
puts "$cmd , $status"
}
:
alias expr {wrapper expr}
:
expr {1+1} ;# wrapper {expr {1+1}} -> expr {1+1} ,0

的な感じです。

386:デフォルトの名無しさん
08/12/11 22:04:10
>>385
これじゃ無限ループになるだろ。exprはrenameして新たにラッパーのexprを定義すれば?

387:デフォルトの名無しさん
08/12/17 17:04:55
>312
>BrowseX for Windows使ってた人いない?

Hv3というtkhtmlベースのブラウザならある。
URLリンク(tkhtml.tcl.tk)

388:デフォルトの名無しさん
08/12/19 21:06:51
Dr. OusterhoutがTclコアチームから抜ける。
URLリンク(groups.google.com)

389:デフォルトの名無しさん
08/12/22 21:53:03
プログラムから逃げてきたのに卒論で無理やりやらされてる
Cで作ったexeファイルをtcl/tkで作ったGUI上で実行したりできるの?

ていうかこんなことも分からない感じで死にそう・・・

390:デフォルトの名無しさん
08/12/22 23:27:50
>>388
そしてその翌日itclのコア組み込みが決定したのであった・・・!

>>389
CでCUIのexe作って、Tcl/Tkでガワ作って、パイプで接続とか。
まあどんなことがやりたいかによる。CでDLL作って、それをTcl/Tk
から使うほうが楽かもしれない。

391:デフォルトの名無しさん
08/12/23 00:07:48
>>389
unixだと楽だが、windowsだと面倒。

392:デフォルトの名無しさん
08/12/23 11:28:21
え、incr Tcl?
正直オブジェクト指向を入れるなら参照とガベコレの概念を入れる前提で
デザインしなおしたほうがいいのに・・・
(逆に言うとこの2つを入れればオブジェクト指向はこれまでどおり拡張でいいし)
オブジェクト手動開放とか今日日ありえないっすよ。

393:デフォルトの名無しさん
08/12/23 11:40:20
>>391
んなこたーない。
execで実行するだけ。
so, dllも同じソースで簡単に作れるし(windowsはmingwのgcc使ってるけど)

394:デフォルトの名無しさん
08/12/23 19:53:07
いやwindowsは苦労するよ。
pathや引数周りに落とし穴がいっぱいある。

MSが早くcygnusを買収してくれればいいのに。

395:デフォルトの名無しさん
08/12/23 20:02:39
>>394
落とし穴ってなに

396:デフォルトの名無しさん
08/12/23 23:13:52
path周りの避け方はマニュアルに書いてあるだろ。
で、なんでcygnusが出てくるんだ?
もはやTclはcygwinをサポートしてないぞ。
素直にActive TclをインストールしてCはMinGW使えばいい。

397:デフォルトの名無しさん
08/12/23 23:38:12
8.6b1きたあああああ!!!
try ~ throwきたあああ!!!
zlibきたあああ!!!
ttk::spinboxきたあああ!!!
tk fontchooserきたああああ!!!
Canvasの回転文字きたああああ!!!
ttkのvistaテーマきたあああ!!!

398:デフォルトの名無しさん
09/01/06 12:23:24
今M1だが、修論でtcl使うはめになってubuntuの起動から勉強してるところなんだけど、
tclでパラレルポートからの入力って使える?
その辺含んだお勧めの書籍なんかあれば知りたい。

399:デフォルトの名無しさん
09/01/06 21:25:39
URLリンク(wiki.tcl.tk)
まずは適当に検索してみればいいとおもうの。

400:本田
09/01/08 21:18:47
AC3Dマニュアル
URLリンク(panda.ecs.cst.nihon-u.ac.jp)
1998年11月6日更新 - AC3Dバージョン2以降に対応

AC3D
URLリンク(mail2.nara-edu.ac.jp)
>3 次元模型 (モデル) を作るためのソフトはモデラーと呼ばれています。
> AC3D はそのモデラーの一つで、随分人気があるようです。
> AC3D は今では商用ソフトになってしまいました。

Shareware Version.
URLリンク(locgate.smtn.stavropol.ru)
古いけどTcl/Tkスクリプト使用して参考になる。

最新版。
URLリンク(www.inivis.com)

401:本田
09/01/09 21:21:13
These are some sample files for the 3D modeller - AC3D
fURLリンク(ftp.uni-duisburg.de)

AC3D Manual(Updated 11th March 1999 - Covers AC3D Version 2 onwards)
fURLリンク(ftp.uni-duisburg.de)
fURLリンク(ftp.uni-duisburg.de)

AC3D Manual Ver. 3.4.1
fURLリンク(ftp.uni-duisburg.de)

URLリンク(locgate.smtn.stavropol.ru)
に付属のGLU32.DLLとOPENGL32.DLLは、おそらくWindows95用でしょう。

Windows95以降に発売されたWindowsには、
GLU32.DLLとOPENGL32.DLLが付属してるとはずなので、
Windows95以降に発売されたWindowsをお使いの場合は、
AC3D v.2.0付属のGLU32.DLLとOPENGL32.DLLを削除したほうが、
AC3D v.2.0の安定性や速度が改善される可能性があります。

402:デフォルトの名無しさん
09/01/13 00:08:38
すみません質問させて下さい。
以下のコードのように、プロシージャfooを作っておいて
複数のボタンをpackする作業をまとめたいと考えています。

proc foo {w msg} {
pack [button $w.$msg -text $msg -command {puts $msg}]
}

pack [frame .f]
foo .f "b1"
foo .f "b2"

ところがボタンを押してcommandを実行させると、
以下のエラーが出ます。
Error: can't read "msg": no such variable

ボタンを押したときにローカル変数msgを参照できていないということだと
思いますが、何か良い解決策はありませんか?
よろしくお願いします。

403:402
09/01/13 00:10:15
使用環境を書き忘れました。
WindowsXPでActiveTcl8.5.4.0.286921-win32-ix86-threaded.exe
をインストールして使っています。

404:デフォルトの名無しさん
09/01/13 00:30:21
-command "puts $msg"

405:402
09/01/13 00:56:06
>>404
できました!
"と{との違いを調べてきます。
早速の回答ありがとうございます。

406:デフォルトの名無しさん
09/01/13 12:59:47
>>402
{}の違いがポイントではなく、-command で指定するコマンドが関数の外で実行されることがポイントなのです。
msg変数は関数fooのローカル変数なので、関数の外で実行されるボタンのコマンドからは参照できません。


407:デフォルトの名無しさん
09/01/13 21:28:04
>>404 ではないですが、もう少し補足しておきます
set msg AAA; pack [button .b -text PushMe -command "puts $msg"]
としておいて、ボタン.bを押すと当然、AAAとコンソールに表示されます。
続けて、set msg BBBとしてボタン.bを押してみて下さい。
コンソールにAAAと表示されますね?
これはどういうことかというと、


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch