From fca49a8a69a0f6bb4feae74c6cd0e93d7fac8b36 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 21 Dec 1995 00:56:57 +0900 Subject: version 0.95 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit https://cache.ruby-lang.org/pub/ruby/1.0/ruby-0.95.tar.gz Thu Dec 21 00:56:57 1995 Yukihiro Matsumoto * version 0.95 - fj.sourcesに * eval.c (rb_eval): rescueのロジックをrb_rescue()に一元化. Wed Dec 20 19:30:58 1995 Yukihiro Matsumoto * Makefile.in: 不要なコンパイルの回避(より完全に). * class.c (singleton_class_new): `single'->`singleton' Tue Dec 19 07:14:33 1995 Yukihiro Matsumoto * io.c (closed?): IOがcloseされているかどうかを知る述語. * parse.y (primary): 特異メソッドの引数のlex_stateが不適切. * lib/tk.rb: tcl->rubyの変換関数の用意. * ext/extmk.rb.in (install): installの2重コンパイルの回避. * array.c (range_beg_len): range指定の不適切なエラーを訂正. * string.c (str_aref): range指定のバグを削除. * lib/tk.rb (tk_split_list): Tclのリストに対応. Mon Dec 18 09:58:12 1995 Yukihiro Matsumoto * version 0.94 * dln.c (dln_load): HP対応(未確認) * eval.c (Init_Proc): BlockをProcに改名. Sat Dec 16 13:46:14 1995 Yukihiro Matsumoto * eval.c (rb_eval): retryでイテレータの再実行ができるように. Fri Dec 15 17:14:30 1995 Yukihiro Matsumoto * eval.c: proc:lambdaの親しみやすい別名 Thu Dec 14 17:21:55 1995 Yukihiro Matsumoto * eval.c (dyna_var_asgn): イテレータブロック内で最初に初期化された ローカル変数の有効範囲をそのブロック内に限定.これでlambdaと呼べ ないことはない. Wed Dec 13 02:30:58 1995 Yukihiro Matsumoto * gc.c: autoloadのマークミス. * lib/tk.rb: wishからの複数行の戻り値に対応 * lib/tkcomposite.rb: 複合widget * variable.c (rb_class2path): ICLASSに対応してなかった. * eval.c (ruby_run): exit(0)のバグ Sat Dec 9 01:21:24 1995 Yukihiro Matsumoto * ext/marshal/marshal.c (dumps|load): 文字列に対する入出力を可能に した(ただし実はファイル経由なのだ). Fri Dec 8 18:29:11 1995 Yukihiro Matsumoto * ext/marshal/marshal.c: シンボルを一度だけ初期化する. Thu Dec 7 07:58:50 1995 Yukihiro Matsumoto * parse.y (yylex): 第1引数の正規表現の認識にエラーがあった.同時に 状態数を減らした. * string.c (str_sub): 置換でスキップ幅が大きすぎた. Wed Dec 6 15:14:23 1995 Yukihiro Matsumoto * string.c (str_sub_method): sub/gsub(!なし)は置換が行なわれなかっ た時,置換前の文字列を返す. Tue Dec 5 00:55:15 1995 Yukihiro Matsumoto * parse.y (yylex): 括弧を省略した時の引数展開の`*'に対応. * eval.c (ruby_run): EXITハンドラ内での例外に対応. * bignum.c (big_cmp): BignumとFixnumの比較で落ちる. Mon Dec 4 14:21:18 1995 Yukihiro Matsumoto * parse.y (call_op): コンパイル時の定数式の展開をやめた.労多くし て益少ないと判断したので. Thu Nov 30 01:35:15 1995 Yukihiro Matsumoto * lib/tk.rb: {Radio,Check}Buttonのvariableの実装. * eval.c (rb_yield_0): Block.callがネストした時のバグ. * io.c (f_select): 常に配列3つをふくむ配列を返すように * lib/tk.rb: fileeventをruby側で実装. Wed Nov 29 17:53:23 1995 Yukihiro Matsumoto * variable.c (rb_ivar_get): selfを常に指定するように. Tue Nov 14 00:07:29 1995 Yukihiro Matsumoto * lib/tk.rb: Tk4.0対応 Mon Nov 13 16:23:32 1995 Yukihiro Matsumoto * version 0.93 Thu Nov 9 23:26:01 1995 Yukihiro Matsumoto * gc.c (gc_mark): モジュールのMixinのマーク忘れ. * parse.y (f_arglist): メソッド定義の引数を括弧で括らなくても良い ようにした. Wed Nov 8 00:17:51 1995 Yukihiro Matsumoto * eval.c (rb_yield_0): 未初期化のローカル変数があった. * eval.c (rb_eval): pendig signalのチェックをeval実行後に行うよう にした.でないとシグナルの発生と検出が遠く離れてしまう事がある. * parse.y: class文のsuperclass部を定数から式に拡張した. * lib/tk.rb: Tkのほぼ全ウィンドウクラスに対応.キャンバスとテキス ト上のオブジェクトが残っている. Tue Nov 7 08:18:37 1995 Yukihiro Matsumoto * signal.c (trap): ブロックを指定できるように. Mon Nov 6 16:44:00 1995 Yukihiro Matsumoto * eval.c (f_caller): 呼出元の情報を得る. * ext/tkutil/tkutil.c: wishのstderr出力を監視することで,エラー処 理を行う. * ext/tkutil/tkutil.c: wishとの通信部をCで記述. Sat Nov 4 01:12:59 1995 Yukihiro Matsumoto * sample/ruby-mode.el (ruby-calculate-indent): インデントの計算を もう少しスマートにした(正規表現のチェック,継続行のチェック). * eval.c (rb_call): 無限再帰を避けるため,関数のネストレベルの制限 を行なう. * lib/tk.rb: Tkインターフェース.まだ不完全だが. * eval.c (rb_yield_0): 空のBlockのバグ. * sample/ruby-mode.el (ruby-calculate-indent): 行末の演算子による 行継続に対応. Fri Nov 3 12:56:21 1995 Yukihiro Matsumoto * eval.c (rb_call): 本体が空の関数の実行にバグ. * parse.y (var_extend): 文字列の末尾の変数展開のバグ. * variable.c (rb_gvar_set): traceの評価時にに変数値を与えるように. * eval.c (f_require): ruby scriptのrequireにbug. * variable.c (rb_const_get): モジュールのinclude対策. Thu Oct 19 13:56:06 1995 Yukihiro Matsumoto * dln.c (dln_load): HP対応でのtypo. Wed Oct 18 17:39:39 1995 Yukihiro Matsumoto * version 0.92 * object.c (krn_type): オブジェクトの動的な型を返すメソッド. Tue Oct 17 00:48:18 1995 Yukihiro Matsumoto * ruby.c (proc_options): -X オプション.chdirだけを行う. * re.c (reg_search): 漢字コードを途中で変更できるように.コンパイ ル時のコードが変更された時にはマッチの直前に正規表現の再コンパイ ルを行う.定数KCODEから変数$KCODEへ. * parse.y: ()のなかにcompexprを許す. * re.c (reg_search): メモリリークを直した. Fri Oct 13 13:19:19 1995 Yukihiro Matsumoto * string.c (str_sub): 文字列置換にバグ. * string.c (str_strip_bang): 文字列の後ろの長さの調整が行われてい なかった. * re.c (reg_search): $&, $1...のはローカルに束縛するようになった. 呼び出したメソッドでのマッチは現スコープの$&などの値に影響しない. マッチの情報をスコープ外で得たいときには$~を使って束縛情報を持ち 出す必要がある. Thu Oct 12 00:33:33 1995 Yukihiro Matsumoto * re.c (reg_search): String:split, String:indexでは$&, $1...が変化 しないようにした. * io.c (rb_str_setter): setterの仕様が変更になっていた. * variable.c (f_trace_var): 第2引数を省略してイテレータとして呼べ るように. Wed Oct 11 11:50:59 1995 Yukihiro Matsumoto * version 0.91 * variable.c (var_setter): 引数が間違っていた.致命的バグ. * io.c (pipe_open): $stderrの値が変更されている時にはそちらを 子プロセスのstderrに設定する. Mon Oct 9 13:06:33 1995 Yukihiro Matsumoto * object.c (mod_to_s): モジュール内のモジュールは`::'を使った表現 で表示されるように. * variable.c (rb_gvar_set): 代入によるループが発生しないように, trace内での代入ではtraceを評価しない. * struct.c (struct_equal): structのequal判定にクラスの一致を含めた. Sat Oct 7 00:18:32 1995 Yukihiro Matsumoto * eval.c (rb_eval): defined?の機能を拡張(yieldのチェック,superの 存在など). Fri Oct 6 12:06:47 1995 Yukihiro Matsumoto * version 0.90 * st.c (st_foreach): 要素を削除した時に要素数が変化していなかった. * hash.c (hash_values): バグ修正.keysを返していた…. * parse.y (call_op): defined? の引数では定数の畳み込みを行わない (チェックする前にコンパイルエラーになっては困る). * スコープ生成の一部見直し. Thu Oct 5 00:29:43 1995 Yukihiro Matsumoto * 関数とクラスの命名規則を変更した.関数名,変数名の全面書き換え. * gc.c (looks_pointerp): ヒープチェックの高速化. * struct.c (Fstruct_aset): 構造体に対する`[]='. (struct_set): 構造体メンバに対する代入. Wed Oct 4 09:54:07 1995 Yukihiro Matsumoto * version 0.89 * eval.c (Frequire): ダイナミックロードのエラーチェックを厳しく. * struct.c: structの構造を完全に書き換えた.以前は順序付きの id->valueの連想配列であったが,今度は構造体毎に新しいクラスを生 成するようにした. * parse.y: `::'の意味をAssocの生成からクラス(モジュール)内の定数ア クセスへ変更. * assoc.c: なくす. Tue Oct 3 13:31:08 1995 Yukihiro Matsumoto * variable.c (Ftrace_var): trace_var, 大域変数への書き込みhookを設 定する. * variable.c: global_entryの構成を書き換えた.これでtrace_varを実 装できる. * file.c (Ffile_stat): "&"で直前のfstatの結果も参照できるように. Fri Sep 29 14:15:13 1995 Yukihiro Matsumoto * version 0.88 * dln.c (dln_load): AIXとHPに対応したコードを入れた(動作は未確認). * ext/extmk.rb.in: 必要に応じて,定数EXTLIBを定義するように. * dln.c (dln_load): dln独立に書き換える.将来の拡張用. (load_1): dln_a_outにおいてソースコードでライブラリを明示的にロー ドする必要がないように変更した. Thu Sep 28 13:31:37 1995 Yukihiro Matsumoto * sample/ruby-mode.el: もっとましなhilit19対応(正規表現). Wed Sep 27 04:12:44 1995 Takahasi Mamoru * sample/test.rb: echoで-nを使わないように(SysV対策). * ext/extmk.rb.in: sub -> sub! Tue Sep 26 19:12:42 1995 Yasuo OHBA * dln.c (dln_find_1): `.', `..'から始まるパスに対応した. Mon Sep 25 12:33:03 1995 Yukihiro Matsumoto * version 0.87 Sat Sep 23 10:00:18 1995 Yukihiro Matsumoto * eval.c (Fmod_modfunc): メソッドをprivateにし,同時に特異メソッド も定義するメソッド.パッケージ的使い方のモジュール用. Fri Sep 22 11:02:44 1995 Yukihiro Matsumoto * lib/find.rb: findを提供するライブラリ * variable.c (rb_define_variable): hookの設定を分離. (add_hook): 1変数に対して複数のhookを設定できるように. Thu Sep 21 00:22:11 1995 Yukihiro Matsumoto * string.c (Fstr_frozen): 文字列が更新不可かどうかをチェックする述 語メソッド. * hash.c (Fhash_aset): keyが文字列の時,キーの内容が変化しないよう に,dupしてfreezeする. Wed Sep 20 16:12:44 1995 Yukihiro Matsumoto * version 0.86 * ext/extmk.rb.in (have_header): キャッシュにバグ. * ext/extmk.rb.in (have_library): 引数の順序が変わった. Thu Sep 14 18:00:59 1995 Yukihiro Matsumoto * object.c (obj_is_instance_of): is_member_ofから名称変更. Wed Sep 13 15:44:35 1995 Yukihiro Matsumoto * string.c (Fstr_tr_bang): 範囲外の文字に対する変換バグ. Tue Sep 12 14:27:58 1995 Yukihiro Matsumoto * file.c (Sfile_expand_path): expand_file_name -> expand_pathに名 称変更. * enum.c (Fenum_member): includes? -> member? に名称変更. * string.c (Fstr_each_byte): StringはByteArrayであるという基本に戻っ て,eachの定義をeach_byteに変更した.今までのeachはeach_lineでア クセスできる. Mon Sep 11 18:31:17 1995 Yukihiro Matsumoto * file.c (cache_stat): ファイル名として"&"を指定すると直前の stat(2)の結果を再利用するように. Fri Sep 8 14:18:51 1995 Yukihiro Matsumoto * ruby.texi: `!', `?'に対応してアップデート. * parse.y: defined -> defined? * file.c: FileOpの一文字メソッドをなくす.一文字テストはtestメソッ ドにまかせる. * parse.y (yylex): 変数名の後ろに`?'も許す.述語メソッドの後ろに `?'を追加する. Thu Sep 7 20:01:33 1995 Yukihiro Matsumoto * string.c: 文字列の中身を更新するメソッドの名前の終りに`!'を付加. `!'の無いバージョンも用意した. * parse.y: 変数名の後ろに`!'を許す. Wed Sep 6 14:12:19 1995 Yukihiro Matsumoto * version 0.85 * string.c (Fstr_dup): 文字列の複製を作る (Fstr_freeze): 文字列の更新不可属性を設定できるように. (Fsub/Fgsub): $_の内容をdupしてから置換を行うように. * ruby.h (CLONESETUP): flagsの状態もコピー Tue Sep 5 01:27:50 1995 Yukihiro Matsumoto * sample/test.rb: 失敗の検出を厳しく. Fri Aug 25 14:31:02 1995 Yukihiro Matsumoto * process.c (Ffork): イテレータとしても動作するように. * version 0.84 * signal.c (sig_beg): ハンドラが設定されている時には再設定しない. * ext/extmk.rb.in (create_makefile): shared objectのリンクの際に `-l'オプションを指定するように. * signal.c (trap): `EXIT'で終了処理を行う設定が出来る. Wed Aug 16 00:13:22 1995 Yukihiro Matsumoto * signal.c (sig_beg): デフォルトではbegin節の中でだけSIGINTを捕捉 するように変更. * io.c (io_ctl): fcntlを持たないシステムにも対応. * 各ディレクトリに分散していたMANIFESTをまとめた.拡張モジュール毎 には必要. * string.c (Sstr_new,str_sub,Fstr_crypt): 引数を自動的に文字列に変 換するように. Sat Aug 12 00:44:02 1995 Yukihiro Matsumoto * string.c (Fstr_crypt): PD cryptを用意した. Fri Aug 11 14:37:03 1995 Yukihiro Matsumoto * assoc.c (Fassoc_clone): assocもcloneできるように. * io.c: マクロREAD_DATA_PENDINGの定義を変更(Linux対応) * io.c (io_fptr_finalize): ftprの開放時の処理を指定できるように. Wed Aug 9 16:52:41 1995 Yukihiro Matsumoto * eval.c (rb_provided): 複数のfeatureをロードすると無限ループに落 ちるという単純な(しかし凶悪な)ミス. * ext/extmk.rb.in (install): dlopen対応を行った.今までdlnにしか十 分に対応していなかった. Tue Aug 8 14:17:06 1995 Yukihiro Matsumoto * version 0.83 Mon Aug 7 12:47:41 1995 Yukihiro Matsumoto * parse.y: resque -> rescue.恥ずかしいがtypoを残しておくわけには いかないよなあ.なんで今まで気がつかなかったのか…. Thu Aug 3 18:18:05 1995 Yukihiro Matsumoto * missing/nt.c: NT移植用の関数群をまとめた. * variable.c (rb_const_get): また例外を発生するようにした.defined がある以上例外を発生させない理由がないので(例外が発生した方がタ イプミスの検出などの点で有利). * variable.c (Fautoload): autoloadを実装.今度は使えるか. Mon Jul 31 15:44:21 1995 Yukihiro Matsumoto * parse.y (arg_ambiguous): 第1引数のあいまいさを警告(-vオプション で有効). * eval.c (rb_eval): `-v'オプションをつけて`def'が呼ばれると不必要 なエラーメッセージが出た. * parse.y (yylex): メソッドの第1引数の判定をもうちょっと賢くした. Fri Jul 28 19:04:43 1995 Yukihiro Matsumoto * parse.y (yylex): `+/-/['の直前に空白が来るかどうかで動作を変更し た(混乱のもとか?) Wed Jul 26 09:21:23 1995 Yukihiro Matsumoto * version 0.82a * sprintf.c (Fsprintf): `%s'で'\0'を含む文字列に対応. * pack.c (Fpck_pack): packの要素確保のバグ. * eval.c (Floop): 無限ループのイテレータ. * io.c (next_argv): 存在しないファイル名が指定された時のエラー処理 が行われていなかった. Mon Jul 24 17:37:34 1995 Yukihiro Matsumoto * version 0.82 * ext/extmk.rb.in (install): 拡張モジュールをstatic linkする場合は そのモジュールが既にrequireされたのと同じようにfeatureを設定する. これで拡張モジュールの機能が必要な時には(static linkされているか どうかにかかわらず)requireすればよくなる. * eval.c (Frequire): `$"'に格納する文字列をフルパスでなくフィーチャ 名とする.rubyスクリプトをロードした時には`.rb',オブジェクトを ロードした時には`.o'をフィーチャ名に付加する.lispのrequireと provideの働きに(少し)近い. Thu Jul 20 12:50:05 1995 Yukihiro Matsumoto * Makefile.in (test): make testができるように. * struct.c (struct_new): typo. * eval.c (rb_eval): `defined'を追加.メソッド/変数/定数の定義状態 を知る事が出来る. Wed Jul 19 18:04:01 1995 Yukihiro Matsumoto * version 0.81 Mon Jul 17 14:53:51 1995 Yukihiro Matsumoto * variable.c (rb_const_get): 未初期化のCONSTANTの値をnilにした.し かし,今後また例外に戻す可能性はある.要はoptionalなクラス/モジュー ルが存在するかチェックしたいだけなんだな. * st.c (int): grow_factorを固定にした(大嶋さんのマシンに対応). Fri Jul 14 00:48:40 1995 Yukihiro Matsumoto * ext/extmk.rb.in: キャッシュのバグを修正. * parse.y (var_extend): #{$数字}に対応した. * dln.c (dln_load_1): `Init_FILENAME'だけを有効に.`init_*'は今後 実行しない. * ext/etc/etc.c : Etcモジュールを拡張モジュールとして分離.実はNT 対応への布石だったりするかもしれない. Tue Jul 11 17:12:48 1995 Yukihiro Matsumoto * gcc -Wallで出たwarningを元にソースを変更. * signal.c (trap): typo. Fri Jul 7 10:08:51 1995 Yukihiro Matsumoto * version 0.80 * ruby.texi: texinfo documentを提供.specとruby.1は無くなった. * signal.c (Ftrap): 割込み禁止中の例外発生に対応. * eval.c (Flambda): Blockオブジェクトを返す.Block.newと同義. Thu Jul 6 00:35:03 1995 Yukihiro Matsumoto * signal.c (Ftrap): SIG_DFLの処理を変更.SIGINTへのデフォルトハン ドラを用意(例外を発生する). * file.c (Sfile_expand_fname): パス名を絶対パスに展開するメソッド. (Sfile_basename): basenameを得るメソッド.拡張子も外せる. (Sfile_dirname): basenameの反対. * eval.c (rb_call): argument評価中の例外発生に対応. * file.c (Ftest): `M', `A', `C'を追加. Tue Jul 4 12:36:33 1995 Yukihiro Matsumoto * file.c (Ftest): ファイルテスト用メソッド. * ruby.c (proc_options): `-r'オプションを追加. * parse.y (f_args): デフォルト引数を追加. * eval.c (rb_call): 該当する引数が無い時,rest引数の値をnilに. * numeric.c (num_equal): 数値以外との比較で例外が発生していた. FALSEを返すように. * eval.c (masign): 多重代入のrest部の動作がおかしかった. Sat Jun 17 01:03:16 1995 Yukihiro Matsumoto * parse.y (gettable): 未初期化のローカル変数の参照(独立した識別子) は正式にメソッド呼び出しとした. * parse.y (read_escape): tokenbufを使わないように修正.それにとも ない,`\C-x',`\M-x'などのエスケープ表現を復活.これでドキュメン トと実際の処理系が一致した. Thu Jun 15 15:42:00 1995 Yukihiro Matsumoto * re.c (re_regcomp): cacheのチェックを改善. Mon Jun 12 18:50:51 1995 Yukihiro Matsumoto * version 0.79 Sat Jun 10 00:25:01 1995 Yukihiro Matsumoto * re.c (re_regcomp): cache判定に`$='の値も反映させた. * sample/test.rb: test suite作成. Fri Jun 9 15:58:34 1995 Yukihiro Matsumoto * re.c (re_regcomp): cacheの判定が間違っていた. Fri Jun 9 00:01:35 1995 Yukihiro Matsumoto (matz@dyna) * eval.c (rb_yield): block構造体に初期化していないメンバ(iter)があっ たのでイテレータのネストが正しく動作しなかった. Thu Jun 8 00:59:03 1995 Yukihiro Matsumoto (matz@dyna) * re.c (=~): String以外との比較がFALSEを返すように(例外を発生して いた). * extmk.rb.in: 判定した値をファイルにキャッシュするようにした. * assoc.c (to_a): to_aメソッドが再定義されていなかった. * eval.c (rb_eval): 初期化されていないローカル変数へのアクセスを引 数の無いメソッド呼び出しと解釈する.ただし,(現状では)メソッドが 定義されていない場合,エラーにせず変数未初期化のwaringを出して nilを返している.「ruby -pe print」などが実行できるという意味で はありがたいこの仕様は,しかし今後の検討が必要である.-- メソッ ド呼び出しとするのを止めるか(以前の仕様),いつもメソッド呼び出し とする(未定義ならばエラー)か,今の仕様で行くか. * eval.c (rb_eval): 初期化されていないローカル変数へのアクセスで (evalなどで)初期化された事が分かった時には以後初期化されたローカ ル変数とみなす. Wed Jun 7 11:58:12 1995 Yukihiro Matsumoto * eval.c (rb_fail): 例外処理後も`$!'をクリアしないように. (rb_fail): `$!'変数に最後に改行を追加しない. * io.c (Fprint): privateメソッドに変更.引数を取らない時の動作を変 更(`$_'を出力する). (Fio_print): 出力先指定のprintメソッド. (Fio_printf): 出力先指定のprintfメソッド. * parse.y: not演算子の追加.優先順位の低い`!'演算子. Mon Jun 5 19:00:55 1995 Yukihiro Matsumoto * version 0.78 Fri Jun 2 17:52:03 1995 Yukihiro Matsumoto * ruby.c (proc_options): -Iオプションで`$:'への追加される順番を修 正した. Fri Jun 2 00:36:34 1995 Yukihiro Matsumoto (matz@dyna) * parse.y: while修飾子の動作を通常のwhileと同じにした.ただし, begin式へのwhile修飾子だけはdo..while型のループとなる. Wed May 31 18:36:30 1995 Yukihiro Matsumoto * version 0.77 Mon May 29 18:39:37 1995 Yukihiro Matsumoto * ext/extmk.rb.in (install): 拡張モジュールもインストールできるよ うに. Fri May 26 14:43:01 1995 Yukihiro Matsumoto * process.c (Fsystem): 戻り値をサブプロセスの失敗/成功を表す真偽値 にした.終了ステータスは`$?'で得る. Tue May 23 10:58:11 1995 Yukihiro Matsumoto * string.c (Fstr_upto): 無限ループに陥らないように. * parse.y (cond): `||'などの右辺に制御式が書けるように,条件式がか ならずしも値を持たなくても良いようにした. * ext/marshal/marshal.c: オブジェクトの読み書きをメソッドの再定義 でコントロールできるように.インスタンスが`_dump_to'というメソッ ドを定義している時はそちらを使うように. * ext/extmk.rb.in: static linkも設定できるような仕様にした. ext/Setupというファイルにディレクトリ名を記述するとそのディレク トリに存在するモジュールはstatic linkされる(はず). * eval.c (rb_eval): `..'を文法に組み込み,`..'と`...'の動作をperl に合わせた. Sat May 20 01:22:48 1995 Yukihiro Matsumoto (matz@dyna) * io.c (select): timeout時と割込み時の動作の明確化. Co-authored-by: Takahasi Mamoru Co-authored-by: Yasuo OHBA --- sample/MANIFEST | 63 ---- sample/aset.rb | 7 - sample/attr.rb | 14 - sample/blk.rb | 9 - sample/case.rb | 14 - sample/cat.rb | 5 - sample/cat2.rb | 5 - sample/clnt.rb | 3 + sample/clone.rb | 18 - sample/const.rb | 24 -- sample/dbm.rb | 2 + sample/exyacc.rb | 20 +- sample/from.rb | 102 +---- sample/gctest.rb | 67 ---- sample/gctest2.rb | 71 ---- sample/getopts.rb | 117 ------ sample/hash.rb | 11 - sample/list3.rb | 6 +- sample/marshal.rb | 13 + sample/math.rb | 4 - sample/mkproto.rb | 27 ++ sample/occur2.rb | 2 +- sample/opt_s.rb | 12 - sample/opt_x.test | 10 - sample/parsearg.rb | 69 ---- sample/rcs.rb | 2 +- sample/ruby-mode.el | 305 +++++++++------ sample/samp.rb | 15 - sample/sieve.rb | 2 +- sample/split.rb | 13 - sample/struct.rb | 8 - sample/svr.rb | 2 + sample/system.rb | 2 - sample/t1.rb | 20 - sample/t2.rb | 23 -- sample/test.rb | 1043 ++++++++++++++++++++++++++++++++++++++++++++++++++- sample/tkbiff.rb | 121 ++++++ sample/tkbrowse.rb | 69 ++++ sample/tkdialog.rb | 62 +++ sample/tkfrom.rb | 115 ++++++ sample/tkhello.rb | 13 + sample/tkline.rb | 29 ++ sample/tktimer.rb | 49 +++ sample/trap.pl | 6 - sample/trap.rb | 3 - sample/tt.rb | 100 ----- 46 files changed, 1756 insertions(+), 941 deletions(-) delete mode 100644 sample/MANIFEST delete mode 100644 sample/aset.rb delete mode 100644 sample/attr.rb delete mode 100644 sample/blk.rb delete mode 100644 sample/case.rb delete mode 100644 sample/cat.rb delete mode 100644 sample/cat2.rb delete mode 100644 sample/clone.rb delete mode 100644 sample/const.rb delete mode 100644 sample/gctest.rb delete mode 100644 sample/gctest2.rb delete mode 100644 sample/getopts.rb delete mode 100644 sample/hash.rb create mode 100644 sample/marshal.rb delete mode 100644 sample/math.rb create mode 100644 sample/mkproto.rb delete mode 100644 sample/opt_s.rb delete mode 100644 sample/opt_x.test delete mode 100644 sample/parsearg.rb delete mode 100644 sample/samp.rb delete mode 100644 sample/split.rb delete mode 100644 sample/struct.rb delete mode 100644 sample/system.rb delete mode 100644 sample/t1.rb delete mode 100644 sample/t2.rb create mode 100644 sample/tkbiff.rb create mode 100644 sample/tkbrowse.rb create mode 100644 sample/tkdialog.rb create mode 100644 sample/tkfrom.rb create mode 100644 sample/tkhello.rb create mode 100644 sample/tkline.rb create mode 100644 sample/tktimer.rb delete mode 100644 sample/trap.pl delete mode 100644 sample/trap.rb delete mode 100644 sample/tt.rb (limited to 'sample') diff --git a/sample/MANIFEST b/sample/MANIFEST deleted file mode 100644 index 93c971b114..0000000000 --- a/sample/MANIFEST +++ /dev/null @@ -1,63 +0,0 @@ -MANIFEST -aset.rb -attr.rb -biorhythm.rb -blk.rb -case.rb -cat.rb -cat2.rb -cbreak.rb -clnt.rb -clone.rb -const.rb -dbm.rb -dir.rb -evaldef.rb -export.rb -exyacc.rb -fib.awk -fib.pl -fib.rb -fib.scm -freq.rb -from.rb -fullpath.pl -fullpath.rb -gctest.rb -gctest2.rb -getopts.rb -getopts.test -hash.rb -io.rb -less.rb -list.rb -list2.rb -list3.rb -math.rb -mpart.rb -occur.pl -occur.rb -occur2.rb -opt_s.rb -opt_x.test -parsearg.rb -rcs.awk -rcs.dat -rcs.rb -ruby-mode.el -samp.rb -sieve.rb -split.rb -struct.rb -svr.rb -system.rb -t1.rb -t2.rb -test.rb -time.rb -trap.pl -trap.rb -trojan.pl -trojan.rb -tt.rb -uumerge.rb diff --git a/sample/aset.rb b/sample/aset.rb deleted file mode 100644 index 414c13ba70..0000000000 --- a/sample/aset.rb +++ /dev/null @@ -1,7 +0,0 @@ -# array set example -# output: -# 07045 - -ary = [0, 0, 4, 5] -ary[1, 0] = [7] -print ary, "\n" diff --git a/sample/attr.rb b/sample/attr.rb deleted file mode 100644 index 1d329ea06a..0000000000 --- a/sample/attr.rb +++ /dev/null @@ -1,14 +0,0 @@ -# attribute access example -# output: -# 10 -# # - -class Foo - attr "test", TRUE -end - -foo = Foo.new -foo.test = 10 -print foo.test, "\n" -foo._inspect.print -print "\n" diff --git a/sample/blk.rb b/sample/blk.rb deleted file mode 100644 index e11cc026ea..0000000000 --- a/sample/blk.rb +++ /dev/null @@ -1,9 +0,0 @@ -def foo() - $block = Block.new -end - -foo(){|i| print "i = ", i, "\n"} -$block.call(2) - -foo(){|i| print "i*2 = ", i*2, "\n"} -$block.call(2) diff --git a/sample/case.rb b/sample/case.rb deleted file mode 100644 index e844cddfd6..0000000000 --- a/sample/case.rb +++ /dev/null @@ -1,14 +0,0 @@ -# case statement example -# output: -# 3..5 - -case "t" -when /1/ - print 1, "\n" -when /t/ - print 3..5, "\n" -when /./ - print 2, "\n" -else - print "else\n" -end diff --git a/sample/cat.rb b/sample/cat.rb deleted file mode 100644 index a3243d308d..0000000000 --- a/sample/cat.rb +++ /dev/null @@ -1,5 +0,0 @@ -# cat -n & `...' operator test -while gets() - if $. == 1 ... ~ /^\*/; print("--") end - printf("%5d: %s", $., $_) -end diff --git a/sample/cat2.rb b/sample/cat2.rb deleted file mode 100644 index bbc1ebb0ff..0000000000 --- a/sample/cat2.rb +++ /dev/null @@ -1,5 +0,0 @@ -# cat -n & `...' operator test -while gets() - if 1 ... /^\*/; print("--") end - printf("%5d: %s", $., $_) -end diff --git a/sample/clnt.rb b/sample/clnt.rb index d2c71ec563..c8c4b2db9f 100644 --- a/sample/clnt.rb +++ b/sample/clnt.rb @@ -1,5 +1,8 @@ # socket example - client side # usage: ruby clnt.rb [host] port + +require "socket" + host=(if $ARGV.length == 2; $ARGV.shift; else "localhost"; end) print("Trying ", host, " ...") STDOUT.flush diff --git a/sample/clone.rb b/sample/clone.rb deleted file mode 100644 index e7d6b00a31..0000000000 --- a/sample/clone.rb +++ /dev/null @@ -1,18 +0,0 @@ -# object cloning & single method test -# output: -# test2 -# test -# test -# clone.rb:18: undefined method `test2' for "#"(Object) -foo = Object.new -def foo.test - print("test\n") -end -bar = foo.clone -def bar.test2 - print("test2\n") -end -bar.test2 -bar.test -foo.test -foo.test2 diff --git a/sample/const.rb b/sample/const.rb deleted file mode 100644 index 50780407b8..0000000000 --- a/sample/const.rb +++ /dev/null @@ -1,24 +0,0 @@ -# constant access test -# output: -# 1234 -# 1268 -TEST1 = 1 -TEST2 = 2 - -module Const - TEST3 = 3 - TEST4 = 4 -end - -module Const2 - TEST3 = 6 - TEST4 = 8 -end - -include Const - -print(TEST1,TEST2,TEST3,TEST4,"\n") - -include Const2 - -print(TEST1,TEST2,TEST3,TEST4,"\n") diff --git a/sample/dbm.rb b/sample/dbm.rb index a2e0659bf5..c77cc2065b 100644 --- a/sample/dbm.rb +++ b/sample/dbm.rb @@ -1,4 +1,6 @@ # ruby dbm acess +require "dbm" + d = DBM.open("test") keys = d.keys if keys.length > 0 then diff --git a/sample/exyacc.rb b/sample/exyacc.rb index cd1170feb4..dafcb037cc 100644 --- a/sample/exyacc.rb +++ b/sample/exyacc.rb @@ -8,15 +8,15 @@ while gets() sbeg = $_.index("\n%%") + 1 send = $_.rindex("\n%%") + 1 $_ = $_[sbeg, send-sbeg] - sub(/.*\n/, "") - gsub(/'{'/, "'\001'") - gsub(/'}'/, "'\002'") - gsub('\*/', "\003\003") - gsub("/\\*[^\003]*\003\003", '') - while gsub(/{[^}{]*}/, ''); end - gsub(/'\001'/, "'{'") - gsub(/'\002'/, "'}'") - while gsub(/^[ \t]*\n(\s)/, '\1'); end - gsub(/([:|])[ \t\n]+(\w)/, '\1 \2') + sub!(/.*\n/, "") + gsub!(/'{'/, "'\001'") + gsub!(/'}'/, "'\002'") + gsub!('\*/', "\003\003") + gsub!("/\\*[^\003]*\003\003", '') + while gsub!(/{[^}{]*}/, ''); end + gsub!(/'\001'/, "'{'") + gsub!(/'\002'/, "'}'") + while gsub!(/^[ \t]*\n(\s)/, '\1'); end + gsub!(/([:|])[ \t\n]+(\w)/, '\1 \2') print $_ end diff --git a/sample/from.rb b/sample/from.rb index f21b1d10f5..2f5fcebe12 100755 --- a/sample/from.rb +++ b/sample/from.rb @@ -1,97 +1,10 @@ #! /usr/local/bin/ruby -module ParseDate - MONTHS = { - 'jan' => 1, 'feb' => 2, 'mar' => 3, 'apr' => 4, - 'may' => 5, 'jun' => 6, 'jul' => 7, 'aug' => 8, - 'sep' => 9, 'oct' =>10, 'nov' =>11, 'dec' =>12 } - MONTHPAT = MONTHS.keys.join('|') - DAYPAT = 'mon|tue|wed|thu|fri|sat|sun' - - def parsedate(date) - if date.sub(/(#{DAYPAT})/i, ' ') - dayofweek = $1 - end - if date.sub(/\s+(\d+:\d+(:\d+)?)/, ' ') - time = $1 - end - if date =~ /19(\d\d)/ - year = $1 - end - if date.sub(/\s*(\d+)\s+(#{MONTHPAT})\S*\s+/i, ' ') - dayofmonth = $1 - monthname = $2 - elsif date.sub(/\s*(#{MONTHPAT})\S*\s+(\d+)\s+/i, ' ') - monthname = $1 - dayofmonth = $2 - elsif date.sub(/\s*(#{MONTHPAT})\S*\s+(\d+)\D+/i, ' ') - monthname = $1 - dayofmonth = $2 - elsif date.sub(/\s*(\d\d?)\/(\d\d?)/, ' ') - month = $1 - dayofmonth = $2 - end - if monthname - month = MONTHS[monthname.tolower] - end - if ! year && date =~ /\d\d/ - year = $& - end - return year, month, dayofmonth - end - -end +require "parsedate" +require "base64" include ParseDate -def decode64(str) - e = -1; - c = "," - for line in str.split("\n") - line.tr 'A-Za-z0-9+/', "\000-\377" - line.each_byte { |ch| - e+=1 - if e==0 - c = ch << 2 - elsif e==1 - c |= ch >>4 - string += [c].pack('c') - c = ch << 4 - elsif e == 2 - c |= ch >> 2 - string += [c].pack('c'); - c = ch << 6 - elsif e==3 - c |= ch - string += [c].pack('c') - e = -1; - end - } - end - return string; -end - -def j2e(str) - while str =~ /\033\$B([^\033]*)\033\(B/ - s = $1 - pre, post = $`, $' - s.gsub(/./) { |ch| - (ch[0]|0x80).chr - } - str = pre + s + post - end - str -end - -def decode_b(str) - while str =~ /=\?ISO-2022-JP\?B\?(.*)=\?=/ - pre, post = $`, $' - s = decode64($1) - str = pre + s + post - end - j2e(str) -end - if $ARGV[0] == '-w' wait = TRUE $ARGV.shift @@ -100,7 +13,7 @@ end class Mail def Mail.new(f) - if !f.is_kind_of(IO) + if !f.is_kind_of?(IO) f = open(f, "r") me = super f.close @@ -114,9 +27,9 @@ class Mail @header = {} @body = [] while f.gets() - $_.chop + $_.chop! continue if /^From / # skip From-line - break if /^[ \t]*$/ # end of header + break if /^$/ # end of header if /^(\S+):\s*(.*)/ @header[attr = $1.capitalize] = $2 elsif attr @@ -149,17 +62,18 @@ $outcount = 0; def fromout(date, from, subj) return if !date y = m = d = 0 + esc = "\033\(B" y, m, d = parsedate(date) if date from = "sombody@somewhere" if ! from subj = "(nil)" if ! subj from = decode_b(from) subj = decode_b(subj) - printf "%-02d/%02d/%02d [%-28.28s] %-40.40s\n", y, m, d, from, subj + printf "%-02d/%02d/%02d [%-28.28s%s] %-40.40s%s\n",y,m,d,from,esc,subj,esc $outcount += 1 end for file in $ARGV - continue if !File.exists(file) + continue if !File.exists?(file) f = open(file, "r") while !f.eof mail = Mail.new(f) diff --git a/sample/gctest.rb b/sample/gctest.rb deleted file mode 100644 index 6810b95481..0000000000 --- a/sample/gctest.rb +++ /dev/null @@ -1,67 +0,0 @@ -# GC stress test -def cons(car, cdr) - [car, cdr] -end - -def car(x) - if x == nil ; nil else x[0] end -end - -def cdr(x) - if x == nil ; nil else x[1] end -end - -def reverse1(x, y) - if x == nil ; y else reverse1(cdr(x), cons(car(x), y)) end -end - -def reverse(x) - reverse1(x, nil) -end - -def ints(low, up) - if low > up - nil - else - cons(low, ints(low+1, up)) - end -end - -def print_int_list(x) - if x == nil - print("NIL\n") - else - print(car(x)) - if nil != cdr(x) - print(", ") - print_int_list(cdr(x)) - else - print("\n") - end - end -end - -print("start\n") - -a = ints(1, 100) -print_int_list(a) -b = ints(1, 50) -print_int_list(b) -print_int_list(reverse(a)) -print_int_list(reverse(b)) -for i in 1 .. 100 - b = reverse(reverse(b)) -# print(i, ": ") -# print_int_list(b) -end -print("a: ") -print_int_list(a) -print("b: ") -print_int_list(b) -print("reverse(a): ") -print_int_list(reverse(a)) -print("reverse(b): ") -print_int_list(reverse(b)) -a = b = nil -print("finish\n") -GC.start() diff --git a/sample/gctest2.rb b/sample/gctest2.rb deleted file mode 100644 index 851d14f217..0000000000 --- a/sample/gctest2.rb +++ /dev/null @@ -1,71 +0,0 @@ -# GC stress test -def cons(car, cdr) - car::cdr -end - -def car(x) - x.car -end - -def cdr(x) - x.cdr -end - -def reverse1(x, y) - if x == nil then - y - else - reverse1(cdr(x), cons(car(x), y)) - end -end - -def reverse(x) - reverse1(x, nil) -end - -def ints(low, up) - if low > up - nil - else - cons(low, ints(low+1, up)) - end -end - -def print_int_list(x) - if x == nil - print("NIL\n") - else - print(car(x)) - if cdr(x) - print(", ") - print_int_list(cdr(x)) - else - print("\n") - end - end -end - -print("start\n") - -a = ints(1, 100) -print_int_list(a) -b = ints(1, 50) -print_int_list(b) -print_int_list(reverse(a)) -print_int_list(reverse(b)) -for i in 1 .. 100 - b = reverse(reverse(b)) -# print(i, ": ") -# print_int_list(b) -end -print("a: ") -print_int_list(a) -print("b: ") -print_int_list(b) -print("reverse(a): ") -print_int_list(reverse(a)) -print("reverse(b): ") -print_int_list(reverse(b)) -a = b = nil -print("finish\n") -GC.start() diff --git a/sample/getopts.rb b/sample/getopts.rb deleted file mode 100644 index 37fd3dc69d..0000000000 --- a/sample/getopts.rb +++ /dev/null @@ -1,117 +0,0 @@ -# -# getopts.rb - get options -# $Release Version: $ -# $Revision: 1.2 $ -# $Date: 1994/02/15 05:17:15 $ -# by Yasuo OHBA(STAFS Development Room) -# -# -- -# IvV̉͂, $OPT_?? ɒlZbg܂. -# ŵȂIvVw肳ꂽ nil Ԃ܂. -# Iꍇ, ZbgꂽIvV̐Ԃ܂. -# -# getopts(single_opts, *opts) -# -# ex. sample [options] filename -# options ... -# -f -x --version --geometry 100x200 -d unix:0.0 -# -# getopts("fx", "version", "geometry:", "d:") -# -# : -# -f -x (= -fx) ̗lȈꕶ̃IvV̎w܂. -# ňȂƂ nil ̎w肪Kvł. -# ȍ~: -# Ol[̃IvV, ̔IvV̎w܂. -# --version , --geometry 300x400 , -d host:0.0 ł. -# 𔺂w ":" KtĂ. -# -# IvV̎w肪ꍇ, ϐ $OPT_?? non-nil , ̃I -# vV̈Zbg܂. -# -f -> $OPT_f = TRUE -# --geometry 300x400 -> $OPT_geometry = 300x400 -# -# - -- , ȍ~, SăIvV̉͂܂. -# - -$RCS_ID="$Header: /var/ohba/RCS/getopts.rb,v 1.2 1994/02/15 05:17:15 ohba Exp ohba $" - -def getopts(single_opts, *opts) - if (opts) - single_colon = "" - long_opts = [] - sc = 0 - for option in opts - if (option.length <= 2) - single_colon[sc, 0] = option[0, 1] - sc += 1 - else - long_opts.push(option) - end - end - end - - opts = {} - count = 0 - while ($ARGV.length != 0) - compare = nil - case $ARGV[0] - when /^--?$/ - $ARGV.shift - break - when /^--.*/ - compare = $ARGV[0][2, ($ARGV[0].length - 2)] - if (long_opts != "") - for option in long_opts - if (option[(option.length - 1), 1] == ":" && - option[0, (option.length - 1)] == compare) - if ($ARGV.length <= 1) - return nil - end - eval("$OPT_" + compare + " = " + '$ARGV[1]') - opts[compare] = TRUE - $ARGV.shift - count += 1 - break - elsif (option == compare) - eval("$OPT_" + compare + " = TRUE") - opts[compare] = TRUE - count += 1 - break - end - end - end - when /^-.*/ - for index in 1..($ARGV[0].length - 1) - compare = $ARGV[0][index, 1] - if (single_opts && compare =~ "[" + single_opts + "]") - eval("$OPT_" + compare + " = TRUE") - opts[compare] = TRUE - count += 1 - elsif (single_colon != "" && compare =~ "[" + single_colon + "]") - if ($ARGV[0][index..-1].length > 1) - eval("$OPT_" + compare + " = " + '$ARGV[0][(index + 1)..-1]') - opts[compare] = TRUE - count += 1 - elsif ($ARGV.length <= 1) - return nil - else - eval("$OPT_" + compare + " = " + '$ARGV[1]') - opts[compare] = TRUE - $ARGV.shift - count = count + 1 - end - break - end - end - else - break - end - - $ARGV.shift - if (!opts.includes(compare)) - return nil - end - end - return count -end diff --git a/sample/hash.rb b/sample/hash.rb deleted file mode 100644 index 85f719e7eb..0000000000 --- a/sample/hash.rb +++ /dev/null @@ -1,11 +0,0 @@ -# hash value -# output: -# 78651 -# 78651 -# 78651 -# -45637 - -print(+-1.0.hash,"\n") -print(-1.0.hash,"\n") -print((-1.0).hash,"\n") -print(-(1.0.hash),"\n") diff --git a/sample/list3.rb b/sample/list3.rb index 2c1beb6fa2..1d756fdff0 100644 --- a/sample/list3.rb +++ b/sample/list3.rb @@ -1,5 +1,5 @@ # Linked list example -- short version -# using _inspect +# using inspect class Point def initialize(x, y) @@ -14,5 +14,5 @@ end list1 = [10, 20, Point.new(2, 3), Point.new(4, 5)] list2 = [20, Point.new(4, 5), list1] -print("list1: ", list1._inspect, "\n") -print("list2: ", list2._inspect, "\n") +print("list1: ", list1.inspect, "\n") +print("list2: ", list2.inspect, "\n") diff --git a/sample/marshal.rb b/sample/marshal.rb new file mode 100644 index 0000000000..3d399ffe68 --- /dev/null +++ b/sample/marshal.rb @@ -0,0 +1,13 @@ +require "marshal" +include Marshal +a = 25.6; +pt = Struct.new('point', :x,:y); +x = pt.new(10, 10) +y = pt.new(20, 20) +rt = Struct.new('rectangle', :origin,:corner); +z = rt.new(x, y) +c = Object.new +s = [a, x, z, c, c, "fff"]; +print s.inspect; +d = dumps(s); +print load(d).inspect diff --git a/sample/math.rb b/sample/math.rb deleted file mode 100644 index c0b5225080..0000000000 --- a/sample/math.rb +++ /dev/null @@ -1,4 +0,0 @@ -# math example -include Math -sqrt(4) -print(Math.sqrt(257), "\n") diff --git a/sample/mkproto.rb b/sample/mkproto.rb new file mode 100644 index 0000000000..1d9c9faccb --- /dev/null +++ b/sample/mkproto.rb @@ -0,0 +1,27 @@ +$/ = nil +while gets() + if /^((void|VALUE|int|char *\*|ID|struct [\w_]+ *\*|st_table *\*) *)?\n([\w\d_]+)\(.*\)\n\s*((.+;\n)*){/ + $_ = $' + printf "%s %s(", $2, $3 + args = [] + for arg in $4.split(/;\n\s*/) + arg.gsub! ' +', ' ' + if arg =~ /,/ + if arg =~ /(([^*]+) *\** *[\w\d_]+),/ + type = $2.strip! + args.push $1.strip! + arg = $' + else + type = "" + end + while arg.sub!(/(\** *[\w\d_]+)(,|$)/, "") + args.push type + " " + $1.strip! + end + else + args.push arg.strip! + end + end + printf "%s);\n", args.join(', ') + redo + end +end diff --git a/sample/occur2.rb b/sample/occur2.rb index 8cd5acbe5e..c450c30b0f 100644 --- a/sample/occur2.rb +++ b/sample/occur2.rb @@ -5,7 +5,7 @@ while gets() for word in $_.split(/\W+/) begin freq[word] = freq[word] + 1 - resque + rescue freq[word] = 1 end end diff --git a/sample/opt_s.rb b/sample/opt_s.rb deleted file mode 100644 index 56ff0eea15..0000000000 --- a/sample/opt_s.rb +++ /dev/null @@ -1,12 +0,0 @@ -#! ./ruby -s -# test for option `-s' - -if ($xyz) - print("xyz = TRUE\n") -end -if ($zzz) - print("zzz = ", $zzz, "\n") -end -if ($ARGV.length > 0) - print($ARGV.join(", "), "\n") -end diff --git a/sample/opt_x.test b/sample/opt_x.test deleted file mode 100644 index 47a67f6cfa..0000000000 --- a/sample/opt_x.test +++ /dev/null @@ -1,10 +0,0 @@ -test for option `-x' - -this is a forwarding header -this is a header too. - -from here script starts -#! ./ruby -v -print("tt\n") -__END__ -this is a trailer diff --git a/sample/parsearg.rb b/sample/parsearg.rb deleted file mode 100644 index e7e2b7a7f3..0000000000 --- a/sample/parsearg.rb +++ /dev/null @@ -1,69 +0,0 @@ -# -# parseargs.rb - parse arguments -# $Release Version: $ -# $Revision: 1.3 $ -# $Date: 1994/02/15 05:16:21 $ -# by Yasuo OHBA(STAFS Development Room) -# -# -- -# ̉͂, $OPT_?? ɒlZbg܂. -# Iꍇ, ZbgꂽIvV̐Ԃ܂. -# -# parseArgs(argc, single_opts, *opts) -# -# ex. sample [options] filename -# options ... -# -f -x --version --geometry 100x200 -d unix:0.0 -# -# parseArgs(1, nil, "fx", "version", "geometry:", "d:") -# -# : -# IvVȊO̍Œ̐ -# : -# IvV̕KvcKKvȂ %TRUE łȂ %FALSE. -# O: -# -f -x (= -fx) ̗lȈꕶ̃IvV̎w܂. -# ňȂƂ nil ̎w肪Kvł. -# lȍ~: -# Ol[̃IvV, ̔IvV̎w܂. -# --version , --geometry 300x400 , -d host:0.0 ł. -# 𔺂w ":" KtĂ. -# -# IvV̎w肪ꍇ, ϐ $OPT_?? non-nil , ̃I -# vV̈Zbg܂. -# -f -> $OPT_f = %TRUE -# --geometry 300x400 -> $OPT_geometry = 300x400 -# -# usage gꍇ, $USAGE usage() w肵܂. -# def usage() -# c -# end -# $USAGE = 'usage' -# usage , --help w肳ꂽ, Ԉwɕ\܂. -# -# - -- , ȍ~, SăIvV̉͂܂. -# - -$RCS_ID="$Header: /var/ohba/RCS/parseargs.rb,v 1.3 1994/02/15 05:16:21 ohba Exp ohba $" - -load("getopts.rb") - -def printUsageAndExit() - if $USAGE - apply($USAGE) - end - exit() -end - -def parseArgs(argc, nopt, single_opts, *opts) - if ((noOptions = getopts(single_opts, *opts)) == nil) - printUsageAndExit() - end - if (nopt && noOptions == 0) - printUsageAndExit() - end - if ($ARGV.length < argc) - printUsageAndExit() - end - return noOptions -end diff --git a/sample/rcs.rb b/sample/rcs.rb index faa4606788..13476267b2 100644 --- a/sample/rcs.rb +++ b/sample/rcs.rb @@ -16,7 +16,7 @@ while gets() s = ""; while xr < hdw x = xr * (1 + y) - y * w / 2 - i = (x / (1 + h) + sw /2) + i = (x / (1 + h) + sw / 2) if (1 < i && i < $_.length); c = $_[i, 1].to_i else diff --git a/sample/ruby-mode.el b/sample/ruby-mode.el index bcbbdc35f3..b555994fea 100644 --- a/sample/ruby-mode.el +++ b/sample/ruby-mode.el @@ -12,21 +12,24 @@ ) (defconst ruby-block-mid-re - "else\\|elsif\\|when\\|resque\\|ensure" + "then\\|else\\|elsif\\|when\\|rescue\\|ensure" ) (defconst ruby-block-end-re "end") (defconst ruby-delimiter - (concat "[$/<(){}#\"'`]\\|\\[\\|\\]\\|\\b\\(" - ruby-block-beg-re "\\|" ruby-block-end-re "\\)\\b") + (concat "[?$/(){}#\"'`]\\|\\[\\|\\]\\|\\<\\(" + ruby-block-beg-re "\\|" ruby-block-end-re "\\)\\>") ) (defconst ruby-negative (concat "^[ \t]*\\(\\b\\(" ruby-block-mid-re "\\)\\|\\(" - ruby-block-end-re "\\)\\b\\|\\}\\|\\]\\)") + ruby-block-end-re "\\)\\>\\|\\}\\|\\]\\)") ) +(defconst ruby-operator-chars "[,.+*/%-&|^~=<>:]") +(defconst ruby-symbol-chars "[a-zA-Z0-9_]") + (defvar ruby-mode-abbrev-table nil "Abbrev table in use in ruby-mode buffers.") @@ -53,17 +56,16 @@ (setq ruby-mode-syntax-table (make-syntax-table)) (modify-syntax-entry ?\' "\"" ruby-mode-syntax-table) (modify-syntax-entry ?\" "\"" ruby-mode-syntax-table) -;;(modify-syntax-entry ?\n ">" ruby-mode-syntax-table) -;;(modify-syntax-entry ?\f ">" ruby-mode-syntax-table) (modify-syntax-entry ?# "<" ruby-mode-syntax-table) - (modify-syntax-entry ?$ "/" ruby-mode-syntax-table) + (modify-syntax-entry ?\n ">" ruby-mode-syntax-table) (modify-syntax-entry ?\\ "'" ruby-mode-syntax-table) - (modify-syntax-entry ?_ "w" ruby-mode-syntax-table) + (modify-syntax-entry ?$ "/" ruby-mode-syntax-table) + (modify-syntax-entry ?? "/" ruby-mode-syntax-table) + (modify-syntax-entry ?_ "_" ruby-mode-syntax-table) (modify-syntax-entry ?< "." ruby-mode-syntax-table) (modify-syntax-entry ?> "." ruby-mode-syntax-table) (modify-syntax-entry ?& "." ruby-mode-syntax-table) (modify-syntax-entry ?| "." ruby-mode-syntax-table) - (modify-syntax-entry ?$ "." ruby-mode-syntax-table) (modify-syntax-entry ?% "." ruby-mode-syntax-table) (modify-syntax-entry ?= "." ruby-mode-syntax-table) (modify-syntax-entry ?/ "." ruby-mode-syntax-table) @@ -152,6 +154,19 @@ The variable ruby-indent-level controls the amount of indentation. (indent-to x) (if (> p 0) (forward-char p))))) +(defun ruby-expr-beg () + (save-excursion + (skip-chars-backward " \t") + (or (bolp) (forward-char -1)) + (or (looking-at ruby-operator-chars) + (looking-at "[\\[({]") + (bolp) + (and (looking-at ruby-symbol-chars) + (forward-word -1) + (or + (looking-at ruby-block-beg-re) + (looking-at ruby-block-mid-re)))))) + (defun ruby-parse-region (start end) (let ((indent-point end) (indent 0) @@ -163,113 +178,97 @@ The variable ruby-indent-level controls the amount of indentation. (if start (goto-char start) (ruby-beginning-of-defun)) - (while (and (> indent-point (point)) - (re-search-forward ruby-delimiter indent-point t)) - (let ((w (buffer-substring (match-beginning 0) (match-end 0))) - (pnt (match-beginning 0))) - (cond - ((or (string= "\"" w) ;skip string - (string= "'" w) - (string= "`" w)) - (cond - ((string= w (char-to-string (char-after (point)))) - (forward-char 1)) - ((re-search-forward (format "[^\\]%s" w) indent-point t) + (save-restriction + (narrow-to-region (point) end) + (while (and (> indent-point (point)) + (re-search-forward ruby-delimiter indent-point t)) + (let ((pnt (point)) w) + (goto-char (match-beginning 0)) + (cond + + ((or (looking-at "\"") ;skip string + (looking-at "'") + (looking-at "`")) + (setq w (char-after (point))) + (cond + ((and (not (eobp)) + (equal w (char-after (point))) + (re-search-forward (format "[^\\]%c" w) indent-point t)) nil) - (t - (goto-char indent-point) - (setq in-string t)))) - ((or (string= "/" w) - (string= "<" w)) - (if (string= "<" w) (setq w ">")) - (let (c) - (save-excursion - (goto-char pnt) - (skip-chars-backward " \t") - (setq c (char-after (1- (point)))) - (if c - (setq c (char-syntax c)))) + (t + (goto-char indent-point) + (setq in-string t)))) + ((looking-at "/") + (if (and (ruby-expr-beg) + (goto-char pnt) + (looking-at "\\([^/\n]\\|\\\\/\\)*") + (eq ?/ (char-after (match-end 0)))) + (goto-char (1+ (match-end 0))) + (goto-char indent-point) + (setq in-string t))) + ((looking-at "\\?") ;skip ?char (cond - ((or (eq c ?.) - (and (eq c ?w) - (save-excursion - (forward-word -1) - (or - (looking-at ruby-block-beg-re) - (looking-at ruby-block-mid-re))))) - (if (search-forward w indent-point t) - nil - (goto-char indent-point) - (setq in-string t)))))) - ((string= "$" w) ;skip $char - (forward-char 1)) - ((string= "#" w) ;skip comment - (forward-line 1)) - ((string= "(" w) ;skip to matching paren - (let ((orig depth)) - (setq nest (cons (point) nest)) - (setq depth (1+ depth)) - (while (and (/= depth orig) - (re-search-forward "[()]" indent-point t)) - (cond - ((= (char-after (match-beginning 0)) ?\( ) - (setq nest (cons (point) nest)) - (setq depth (1+ depth))) - (t - (setq nest (cdr nest)) - (setq depth (1- depth))))) - (if (> depth orig) (setq in-paren ?\()))) - ((string= "[" w) ;skip to matching paren - (let ((orig depth)) - (setq nest (cons (point) nest)) - (setq depth (1+ depth)) - (while (and (/= depth orig) - (re-search-forward "\\[\\|\\]" indent-point t)) - (cond - ((= (char-after (match-beginning 0)) ?\[ ) - (setq nest (cons (point) nest)) - (setq depth (1+ depth))) - (t - (setq nest (cdr nest)) - (setq depth (1- depth))))) - (if (> depth orig) (setq in-paren ?\[)))) - ((string= "{" w) ;skip to matching paren - (let ((orig depth)) - (setq nest (cons (point) nest)) + ((ruby-expr-beg) + (looking-at "?\\(\\\\C-\\|\\\\M-\\)*.") + (goto-char (match-end 0))) + (t + (goto-char pnt)))) + ((looking-at "\\$") ;skip $char + (goto-char pnt) + (forward-char 1)) + ((looking-at "#") ;skip comment + (forward-line 1) + (goto-char pnt)) + ((looking-at "[\\[({]") + (setq nest (cons (cons (char-after (point)) pnt) nest)) (setq depth (1+ depth)) - (while (and (/= depth orig) - (re-search-forward "[{}]" indent-point t)) - (cond - ((= (char-after (match-beginning 0)) ?{ ) - (setq nest (cons (point) nest)) - (setq depth (1+ depth))) - (t - (setq nest (cdr nest)) - (setq depth (1- depth))))) - (if (> depth orig) (setq in-paren ?{)))) - ((string-match ruby-block-end-re w) - (setq nest (cdr nest)) - (setq depth (1- depth))) - ((string-match ruby-block-beg-re w) - (let (c) - (save-excursion - (goto-char pnt) - (skip-chars-backward " \t") - (setq c (char-after (1- (point))))) - (if (or (null c) (= c ?\n) (= c ?\;)) - (progn - (setq nest (cons (point) nest)) - (setq depth (1+ depth)))))) - (t - (error (format "bad string %s" w))))))) - (list in-string in-paren (car nest) depth))) + (goto-char pnt)) + ((looking-at "[])}]") + (setq nest (cdr nest)) + (setq depth (1- depth)) + (goto-char pnt)) + ((looking-at ruby-block-end-re) + (if (and (not (bolp)) + (progn + (forward-char -1) + (eq ?_ (char-after (point)))) + (progn + (goto-char pnt) + (eq ?_ (char-after (point))))) + nil + (setq nest (cdr nest)) + (setq depth (1- depth))) + (goto-char pnt)) + ((looking-at ruby-block-beg-re) + (and + (or (bolp) + (progn + (forward-char -1) + (not (eq ?_ (char-after (point)))))) + (save-excursion + (goto-char pnt) + (not (eq ?_ (char-after (point))))) + (skip-chars-backward " \t") + (or (bolp) + (save-excursion + (forward-char -1) + (looking-at ruby-operator-chars))) + (progn + (setq nest (cons (cons nil pnt) nest)) + (setq depth (1+ depth)))) + (goto-char pnt)) + (t + (error (format "bad string %s" + (buffer-substring (point) pnt) + ))))))) + (list in-string (car nest) depth)))) (defun ruby-calculate-indent (&optional parse-start) (save-excursion (beginning-of-line) (let ((indent-point (point)) (case-fold-search nil) - state eol + state bol eol (indent 0)) (if parse-start (goto-char parse-start) @@ -281,25 +280,74 @@ The variable ruby-indent-level controls the amount of indentation. (setq indent nil)) ; do nothing ((nth 1 state) ; in paren - (goto-char (nth 2 state)) + (goto-char (cdr (nth 1 state))) (setq indent - (if (and (eq (nth 1 state) ?\( ) (not (looking-at "$"))) + (if (and (eq (car (nth 1 state)) ?\( ) + (not (looking-at "(\\s *$"))) (current-column) (+ (current-indentation) ruby-indent-level)))) - ((> (nth 3 state) 0) ; in nest - (goto-char (nth 2 state)) + ((> (nth 2 state) 0) ; in nest + (goto-char (cdr (nth 1 state))) (forward-word -1) ; skip back a keyword (setq indent (+ (current-column) ruby-indent-level))) (t ; toplevel (setq indent 0))) - (goto-char indent-point) - (end-of-line) - (setq eol (point)) - (beginning-of-line) - (if (re-search-forward ruby-negative eol t) + + (cond + (indent + (goto-char indent-point) + (end-of-line) + (setq eol (point)) + (beginning-of-line) + (cond + ((re-search-forward ruby-negative eol t) (setq indent (- indent ruby-indent-level))) + ;;operator terminated lines + ((and + (save-excursion + (beginning-of-line) + (not (bobp))) + (or (null (car (nth 1 state))) ;not in parens + (and (eq (car (nth 1 state)) ?\{) + (save-excursion ;except non-block braces + (goto-char (cdr (nth 1 state))) + (or (bobp) (forward-char -1)) + (not (ruby-expr-beg)))))) + (beginning-of-line) + (skip-chars-backward " \t\n") + (beginning-of-line) ; goto beginning of non-empty line + (setq bol (point)) + (end-of-line) + (setq eol (point)) + (and (search-backward "#" bol t) ; check for comment line + (not (eq ?? (char-after (1- (point))))) + (not (nth 0 (ruby-parse-region parse-start (point)))) + (setq eol (point))) + (goto-char eol) + (skip-chars-backward " \t") + (or (bobp) (forward-char -1)) + (and (looking-at ruby-operator-chars) +;; (or (not (eq ?/ (char-after (point)))) +;; (progn +;; (not (nth 0 (ruby-parse-region parse-start (point)))))) + (or (not (eq ?/ (char-after (point)))) + (null (nth 0 (ruby-parse-region parse-start (point))))) + (save-excursion + (goto-char parse-start) + (sit-for 1)) + (not (eq (char-after (1- (point))) ?$)) + (or (not (eq ?| (char-after (point)))) + (save-excursion + (or (eolp) (forward-char -1)) + (and (search-backward "|" bol t) + (skip-chars-backward " \t\n") + (and (not (eolp)) + (progn + (forward-char -1) + (not (looking-at "\\{"))))))) + (setq indent (+ indent ruby-indent-level))))))) indent))) (defun ruby-electric-brace (arg) @@ -329,7 +377,7 @@ An end of a defun is found by moving forward from the beginning of one." (interactive "*") (save-excursion (delete-region (point) (progn (skip-chars-backward " \t") (point)))) - (insert ?\n) + (newline) (save-excursion (forward-line -1) (indent-according-to-mode)) @@ -348,3 +396,26 @@ An end of a defun is found by moving forward from the beginning of one." (goto-char beg) (while (re-search-forward "^\\([ \t]*\\)#" end t) (replace-match "\\1" nil nil)))) + +(if (featurep 'hilit19) + (hilit-set-mode-patterns + 'ruby-mode + '(("\\s #.*$" nil comment) + ("^#.*$" nil comment) + ("\\$\\(.\\|\\sw+\\)" nil type) + ("[^$\\?]\\(\"[^\\\"]*\\(\\\\\\(.\\|\n\\)[^\\\"]*\\)*\"\\)" 1 string) + ("[^$\\?]\\('[^\\']*\\(\\\\\\(.\\|\n\\)[^\\']*\\)*'\\)" 1 string) + ("^/\\([^/\n]\\|\\\\/\\)*/" nil string) + ("[^a-zA-Z_]\\s *\\(/\\([^/\n]\\|\\\\/\\)*/\\)" 1 string) + ("\\(begin\\|case\\|else\\|elsif\\|end\\|ensure\\|for\\|if\\|rescue\\|then\\|when\\|while\\)\\s *\\(/\\([^/\n]\\|\\\\/\\)*/\\)" 2 string) + ("^\\s *require.*$" nil include) + ("^\\s *load.*$" nil include) + ("^\\s *\\(include\\|alias\\|undef\\).*$" nil decl) + ("^\\s *\\<\\(class\\|def\\|module\\)\\>" "[)\n;]" defun) + ("[^_]\\<\\(begin\\|case\\|else\\|elsif\\|end\\|ensure\\|for\\|if\\|rescue\\|then\\|when\\|while\\)\\>[^_]" 1 defun) + ("[^_]\\<\\(and\\|break\\|continue\\|fail\\|in\\|not\\|or\\|redo\\|retry\\|return\\|super\\|yield\\)\\>[^_]" 1 keyword) + ("[^_]\\<\\(self\\|nil\\|TRUE\\|FALSE\\|__LINE__\\|__FILE__\\)\\>[^_]" 1 define) + ("$.[a-zA-Z_0-9]*" nil struct) + ("@[a-zA-Z_0-9]+" nil struct) + ("[^_]\\<[A-Z].[a-zA-Z_0-9]*" nil define) + ("^__END__" nil label)))) diff --git a/sample/samp.rb b/sample/samp.rb deleted file mode 100644 index 4052a308c1..0000000000 --- a/sample/samp.rb +++ /dev/null @@ -1,15 +0,0 @@ -# Sp܂ރXNvg -# g: samp.rb file.. - -P = 0 -while gets() - printf("%3d: %s", $., $_) - while sub(/\w+/, '') - if $& != ""; - P += 1 - end - end - if ($. >= 10); break; end -end -printf("line: %d\n", $.) -printf("word: %d\n", P) diff --git a/sample/sieve.rb b/sample/sieve.rb index 640cc32b08..a953784284 100644 --- a/sample/sieve.rb +++ b/sample/sieve.rb @@ -12,7 +12,7 @@ for i in 2 .. max print ", " print i sieve.push(i) - resque + rescue end end print "\n" diff --git a/sample/split.rb b/sample/split.rb deleted file mode 100644 index 2b6f3921ce..0000000000 --- a/sample/split.rb +++ /dev/null @@ -1,13 +0,0 @@ -# split test -print("1 byte string", "\n") -print("1 byte string".reverse, "\n") - -print("ʸ", "\n") -print("ʸ".reverse, "\n") - -print("1 byte string", "\n") -print("1 byte string".split(//).reverse.join(":"), "\n") -print("ʸ", "\n") -print("ʸ".split(//).reverse.join(":"), "\n") -print("Ѥ1byteκ", "\n") -print("Ѥ1byteκ".split(//).reverse.join(":"), "\n") diff --git a/sample/struct.rb b/sample/struct.rb deleted file mode 100644 index 322764d02f..0000000000 --- a/sample/struct.rb +++ /dev/null @@ -1,8 +0,0 @@ -#output: -# struct test -# 1 - -foo = Struct.new("test", "a1"::1, "a2"::2) -print(foo, "\n") -bar = foo.clone -print(bar.a1, "\n") diff --git a/sample/svr.rb b/sample/svr.rb index 23b2bf71f6..460c16bedf 100644 --- a/sample/svr.rb +++ b/sample/svr.rb @@ -1,6 +1,8 @@ # socket example - server side # usage: ruby svr.rb +require "socket" + gs = TCPserver.open(0) addr = gs.addr addr.shift diff --git a/sample/system.rb b/sample/system.rb deleted file mode 100644 index 02f3782b39..0000000000 --- a/sample/system.rb +++ /dev/null @@ -1,2 +0,0 @@ -# command string -print(`echo foobar`) diff --git a/sample/t1.rb b/sample/t1.rb deleted file mode 100644 index 701a1cd389..0000000000 --- a/sample/t1.rb +++ /dev/null @@ -1,20 +0,0 @@ -def test(a1, *a2) - while 1 - case gets() - when nil - break - when /^-$/ - print("-\n") - return - when /^-help/ - print("-help\n") - break - end - end - print(a1, a2, "\n") -end - -print($ARGV, "\n") -print("in: ") -test(1) -print("end\n") diff --git a/sample/t2.rb b/sample/t2.rb deleted file mode 100644 index 2e3741e8f1..0000000000 --- a/sample/t2.rb +++ /dev/null @@ -1,23 +0,0 @@ -#print("in Print\n") -def t2() end - -def println(*args) - for a in args - t2() - print(a) - end - print("\n") -end - -def tt - for i in 1..10 - println("i:", i); - yield(i); - end -end - -test = tt{|i| - if i == 3; break end - println("ttt: ", i); -} -#exit() diff --git a/sample/test.rb b/sample/test.rb index 9c422cc94a..7f26433181 100644 --- a/sample/test.rb +++ b/sample/test.rb @@ -1,5 +1,1040 @@ -index = 1 -for argument in $ARGV - printf("%d:%s\n", index, argument) - index = index + 1 +#! /usr/local/bin/ruby + +$testnum=0 + +def check(what) + printf "%s\n", what + $what = what + $testnum = 0 end + +def ok + $testnum+=1 + printf "ok %d\n", $testnum +end + +def notok + $testnum+=1 + printf "not ok %s %d\n", $what, $testnum + $failed = TRUE +end + +# make sure conditional operators work + +check "condition" + +$x = '0'; + +$x == $x && ok +$x != $x && notok +$x == $x || notok +$x != $x || ok + +# first test to see if we can run the tests. + +check "if"; + +$x = 'test'; +if $x == $x then ok else notok end +if $x != $x then notok else ok end + +check "case" + +case 5 +when 1, 2, 3, 4, 6, 7, 8 + notok +when 5 + ok +end + +case 5 +when 5 + ok +when 1..10 + notok +end + +case 5 +when 5 + ok +else + notok +end + +case "foobar" +when /^f.*r$/ + ok +else + notok +end + +check "while"; + +tmp = open("while_tmp", "w") +tmp.print "tvi925\n"; +tmp.print "tvi920\n"; +tmp.print "vt100\n"; +tmp.print "Amiga\n"; +tmp.print "paper\n"; +tmp.close + +# test break + +tmp = open("while_tmp", "r") + +while tmp.gets() + break if /vt100/ +end + +if !tmp.eof && /vt100/ then + ok +else + notok +end +tmp.close + +# test continue +$bad = FALSE +tmp = open("while_tmp", "r") +while tmp.gets() + continue if /vt100/; + $bad = 1 if /vt100/; +end +if !tmp.eof || /vt100/ || $bad + notok +else + ok +end +tmp.close + +# test redo +$bad = FALSE +tmp = open("while_tmp", "r") +while tmp.gets() + if gsub!('vt100', 'VT100') + gsub!('VT100', 'Vt100') + redo; + end + $bad = 1 if /vt100/; + $bad = 1 if /VT100/; +end +if !tmp.eof || $bad + notok +else + ok +end +tmp.close + +# test interval +$bad = FALSE +tmp = open("while_tmp", "r") +while tmp.gets() + break if not 1..2 + if /vt100/ || /Amiga/ || /paper/ + $bad = TRUE + notok + break + end +end +ok if not $bad +tmp.close + +File.unlink "while_tmp" or `/bin/rm -f "while_tmp"` + +# exception handling +check "exception"; + +begin + fail "this must be handled" + notok +rescue + ok +end + +$bad = TRUE +begin + fail "this must be handled no.2" +rescue + if $bad + $bad = FALSE + retry + notok + end +end +ok + +$bad = TRUE +$string = "this must be handled no.3" +begin + fail $string +rescue +ensure + $bad = FALSE + ok +end +notok if $bad || $! != $string + +# exception in rescue clause +begin + begin + fail "this must be handled no.4" + rescue + fail "exception in rescue clause" + end + notok +rescue + ok +end + +check "array" +$x = [0, 1, 2, 3, 4, 5] +if $x[2] == 2 + ok +else + notok +end + +if $x[1..3] == [1, 2, 3] + ok +else + notok +end + +if $x[1,3] == [1, 2, 3] + ok +else + notok +end + +if [1, 2] + [3, 4] == [1, 2, 3, 4] + ok +else + notok +end + +$x[0, 2] = 10 +if $x[0] == 10 && $x[1] == 2 + ok +else + notok +end + +$x[0, 0] = -1 +if $x[0] == -1 && $x[1] == 10 + ok +else + notok +end + +$x[-1, 1] = 20 +if $x[-1] == 20 && $x.pop == 20 + ok +else + notok +end + +$x = ["it", "came", "to", "pass", "that", "..."] +$x = $x.sort.join(" ") +if $x == "... came it pass that to" + ok +else + notok +end + +# split test +if "1 byte string".split(//).reverse.join(":") == "g:n:i:r:t:s: :e:t:y:b: :1" + ok +else + notok +end + +$x = [1] +if ($x * 5).join(":") == '1:1:1:1:1' then ok else notok end +if ($x * 1).join(":") == '1' then ok else notok end +if ($x * 0).join(":") == '' then ok else notok end + +check "hash" +$x = {1=>2, 2=>4, 3=>6} +$y = {1, 2, 2, 4, 3, 6} + +if $x[1] == 2 + ok +else + notok +end + +begin + for k,v in $y + fail if k*2 != v + end + ok +rescue + notok +end + +if $x.length == 3 + ok +else + notok +end + +if $x.has_key?(1) + ok +else + notok +end + +if $x.has_value?(4) + ok +else + notok +end + +if $x.indexes(2,3) == [4,6] + ok +else + notok +end + +$z = $y.keys.join(":") +if $z == "1:2:3" + ok +else + notok +end + +$z = $y.values.join(":") +if $z == "2:4:6" + ok +else + notok +end + +if $x == $y + ok +else + notok +end + +$y.shift +if $y.length == 2 + ok +else + notok +end + +check "iterator" + +if iterator? then notok else ok end + +def ttt + if iterator? then ok else notok end +end +ttt{} + +# yield at top level +begin + yield + notok +rescue + ok +end + +$x = [1, 2, 3, 4] +$y = [] + +# iterator over array +for i in $x + $y.push i +end +if $x == $y + ok +else + notok +end + +# nested iterator +def tt + 1.upto(10) {|i| + yield i + } +end + +tt{|i| break if i == 5} +if i == 5 + ok +else + notok +end + +# iterator break/redo/continue/retry +done = TRUE +loop{ + break + done = FALSE + notok +} +ok if done + +done = TRUE +$bad = FALSE +loop { + break if not done + done = FALSE + continue + $bad = TRUE +} +if $bad + notok +else + ok +end + +done = TRUE +$bad = FALSE +loop { + break if not done + done = FALSE + redo + $bad = TRUE +} +if $bad + notok +else + ok +end + +$x = [] +for i in 1 .. 7 + $x.push(i) +end +if $x.size == 7 + ok +else + notok +end +# $x == [1, 2, 3, 4, 5, 6, 7] +$done = FALSE +$x = [] +for i in 1 .. 7 # see how retry works in iterator loop + if i == 4 and not $done + $done = TRUE + retry + end + $x.push(i) +end +# $x == [1, 2, 3, 1, 2, 3, 4, 5, 6, 7] +if $x.size == 10 + ok +else + notok +end + +check "bignum" +def fact(n) + return 1 if n == 0 + return n*fact(n-1) +end +if fact(40) == 815915283247897734345611269596115894272000000000 + ok +else + notok +end +if fact(40) == 815915283247897734345611269596115894272000000001 + notok +else + ok +end + +check "string & char" + +if "abcd" == "abcd" + ok +else + notok +end + +if "abcd" =~ "abcd" + ok +else + notok +end + +$foo = "abc" +if "#$foo = abc" == "abc = abc" + ok +else + notok +end + +if "#{$foo} = abc" == "abc = abc" + ok +else + notok +end + +foo = "abc" +if "#{foo} = abc" == "abc = abc" + ok +else + notok +end + +if '-' * 5 == '-----' then ok else notok end +if '-' * 1 == '-' then ok else notok end +if '-' * 0 == '' then ok else notok end + +foo = '-' +if foo * 5 == '-----' then ok else notok end +if foo * 1 == '-' then ok else notok end +if foo * 0 == '' then ok else notok end + +# character constants(assumes ASCII) +if "a"[0] == ?a + ok +else + notok +end + +if ?a == ?a + ok +else + notok +end + +if ?\C-a == 1 + ok +else + notok +end + +if ?\M-a == 225 + ok +else + notok +end + +if ?\M-\C-a == 129 + ok +else + notok +end + +$x = "abcdef" +$y = [ ?a, ?b, ?c, ?d, ?e, ?f ] +$bad = FALSE +$x.each_byte {|i| + if i != $y.shift + $bad = TRUE + break + end +} +if not $bad + ok +else + notok +end + +check "asignment" +a = nil +if a == nil + ok +else + notok +end + +a, b = 1, 2 +if a == 1 and b == 2 then + ok +else + notok +end + +a, *b = 1, 2, 3 +if a == 1 and b == [2, 3] then + ok +else + notok +end + +check "call" +def aaa(a, b=100, *rest) + res = [a, b] + res += rest if rest + return res +end + +begin + aaa() + notok +rescue + ok +end + +begin + aaa + notok +rescue + ok +end + +begin + if aaa(1) == [1, 100] + ok + else + fail + end +rescue + notok +end + +begin + if aaa(1, 2) == [1, 2] + ok + else + fail + end +rescue + notok +end + +begin + if aaa(1, 2, 3, 4) == [1, 2, 3, 4] + ok + else + fail + end +rescue + notok +end + +begin + if aaa(1, *[2, 3, 4]) == [1, 2, 3, 4] + ok + else + fail + end +rescue + notok +end + +check "proc" +$proc = proc{|i| i} +if $proc.call(2) == 2 + ok +else + notok +end + +$proc = proc{|i| i*2} +if $proc.call(2) == 4 + ok +else + notok +end + +proc{ + iii=5 # dynamic local variable + $proc = proc{ |i| + iii = i + } + $proc2 = proc { + $x = iii # dynamic variables shared by procs + } + if defined?(iii) # dynamic variables' scope + ok + else + notok + end +}.call +if defined?(iii) # out of scope + notok +else + ok +end +$x=0 +$proc.call(5) +$proc2.call +if $x == 5 + ok +else + notok +end + +check "signal" +begin + kill "SIGINT", $$ + sleep 1 + notok +rescue + ok +end + +$x = 0 +trap "SIGINT", proc{|sig| $x = sig;fail} +begin + kill "SIGINT", $$ + sleep 1 + notok +rescue + if $x == 2 + ok + else + notok + end +end + +$x = FALSE +trap "SIGINT", "$x = TRUE;fail" +begin + kill "SIGINT", $$ + sleep 1 + notok +rescue + if $x + ok + else + notok + end +end + +check "eval" +$bad=FALSE +eval 'while FALSE; $bad = TRUE; print "foo\n" end +if not $bad then ok else notok end' + +$foo = 'ok' +begin + eval $foo +rescue + notok +end + +check "system" +if `echo foobar` == "foobar\n" + ok +else + notok +end + +if `./ruby -e 'print "foobar"'` == 'foobar' + ok +else + notok +end + +tmp = open("script_tmp", "w") +tmp.print "print $zzz\n"; +tmp.close + +if `./ruby -s script_tmp -zzz` == 't' + ok +else + notok +end + +if `./ruby -s script_tmp -zzz=555` == '555' + ok +else + notok +end + +tmp = open("script_tmp", "w") +tmp.print "#! /usr/local/bin/ruby -s\n"; +tmp.print "print $zzz\n"; +tmp.close + +if `./ruby script_tmp -zzz=678` == '678' + ok +else + notok +end + +tmp = open("script_tmp", "w") +tmp.print "this is a leading junk\n"; +tmp.print "#! /usr/local/bin/ruby -s\n"; +tmp.print "print $zzz\n"; +tmp.print "__END__\n"; +tmp.print "this is a trailing junk\n"; +tmp.close + +if `./ruby -x script_tmp` == 'nil' + ok +else + notok +end + +if `./ruby -x script_tmp -zzz=555` == '555' + ok +else + notok +end + +tmp = open("script_tmp", "w") +for i in 1..5 + tmp.print i, "\n" +end +tmp.close + +`./ruby -i.bak -pe 'sub(/^[0-9]+$/){$&.to_i * 5}' script_tmp` +done = TRUE +tmp = open("script_tmp", "r") +while tmp.gets + if $_.to_i % 5 != 0 + done = FALSE + notok + break + end +end +ok if done + +File.unlink "script_tmp" or `/bin/rm -f "script_tmp"` +File.unlink "script_tmp.bak" or `/bin/rm -f "script_tmp.bak"` + +check "const" +TEST1 = 1 +TEST2 = 2 + +module Const + TEST3 = 3 + TEST4 = 4 +end + +module Const2 + TEST3 = 6 + TEST4 = 8 +end + +include Const + +if [TEST1,TEST2,TEST3,TEST4] == [1,2,3,4] + ok +else + notok +end + +include Const2 + +if [TEST1,TEST2,TEST3,TEST4] == [1,2,6,8] + ok +else + notok +end + +check "clone" +foo = Object.new +def foo.test + "test" +end +bar = foo.clone +def bar.test2 + "test2" +end + +if bar.test2 == "test2" + ok +else + notok +end + +if bar.test == "test" + ok +else + notok +end + +if foo.test == "test" + ok +else + notok +end + +begin + foo.test2 + notok +rescue + ok +end + +check "pack" + +$format = "c2x5CCxsdila6"; +# Need the expression in here to force ary[5] to be numeric. This avoids +# test2 failing because ary2 goes str->numeric->str and ary doesn't. +ary = [1,-100,127,128,32767,987.654321098 / 100.0,12345,123456,"abcdef"] +$x = ary.pack($format) +ary2 = $x.unpack($format) + +if ary.length == ary2.length then ok else notok end + +if ary.join(':') == ary2.join(':') then ok else notok end + +if $x =~ /def/ then ok else notok end + +check "math" +if Math.sqrt(4) == 2 + ok +else + notok +end + +include Math +if sqrt(4) == 2 + ok +else + notok +end + +check "struct" +struct_test = Struct.new("Test", :foo, :bar) +if struct_test == Struct::Test + ok +else + notok +end +test = struct_test.new(1, 2) +if test.foo == 1 && test.bar == 2 + ok +else + notok +end +if test[0] == 1 && test[1] == 2 + ok +else + notok +end +a, b = test +if a == 1 && b == 2 + ok +else + notok +end +test[0] = 22 +if test.foo == 22 + ok +else + notok +end +test.bar = 47 +if test.bar == 47 + ok +else + notok +end + +check "variable" +if $$.is_instance_of? Fixnum + ok +else + notok +end + +begin + $$ = 5 + notok +rescue + ok +end + +foobar = "foobar" +$_ = foobar +if $_ == foobar + ok +else + notok +end + +check "trace" +$x = 1234 +$y = 0 +trace_var :$x, proc{$y = $x} +$x = 40414 +if $y == $x + ok +else + notok +end + +untrace_var :$x +$x = 19660208 +if $y != $x + ok +else + notok +end + +trace_var :$x, proc{$x *= 2} +$x = 5 +if $x == 10 + ok +else + notok +end +untrace_var :$x + +check "defined?" +if defined? $x + ok +else + notok +end + +foo=5 +if defined? foo + ok +else + notok +end + +if defined? Array + ok +else + notok +end + +if defined? Object.new + ok +else + notok +end + +if defined? 1 == 2 + ok +else + notok +end + +if defined? fail + ok +else + notok +end + +def defined_test + return defined?(yield) +end + +if defined_test + notok +else + ok +end + +if defined_test{} + ok +else + notok +end + +check "gc" +begin + 1.upto(10000) { + tmp = [0,1,2,3,4,5,6,7,8,9] + } + tmp = nil + ok +rescue + notok +end + +print "end of test\n" if not $failed diff --git a/sample/tkbiff.rb b/sample/tkbiff.rb new file mode 100644 index 0000000000..9b406010cb --- /dev/null +++ b/sample/tkbiff.rb @@ -0,0 +1,121 @@ +#! /usr/local/bin/ruby + +if $ARGV.length == 0 + if ENV['MAIL'] + $spool = ENV['MAIL'] + else + $spool = '/usr/spool/mail/' + ENV['USER'] + end +else + $spool = $ARGV[0] +end + +exit if fork + +require "parsedate" +require "base64" + +include ParseDate + +class Mail + def Mail.new(f) + if !f.is_kind_of?(IO) + f = open(f, "r") + me = super + f.close + else + me = super + end + return me + end + + def initialize(f) + @header = {} + @body = [] + while f.gets() + $_.chop! + continue if /^From / # skip From-line + break if /^$/ # end of header + if /^(\S+):\s*(.*)/ + @header[attr = $1.capitalize] = $2 + elsif attr + sub(/^\s*/, '') + @header[attr] += "\n" + $_ + end + end + + return if ! $_ + + while f.gets() + break if /^From / + @body.push($_) + end + end + + def header + return @header + end + + def body + return @body + end + +end + +require "tkscrollbox" + +$top = TkRoot.new +$top.withdraw +$list = TkScrollbox.new($top) { + relief 'raised' + width 80 + height 8 + setgrid 'yes' + pack +} +TkButton.new($top) { + text 'Dismiss' + command proc {$top.withdraw} + pack('fill'=>'both','expand'=>'yes') +} +$top.bind "Control-c", proc{exit} +$top.bind "Control-q", proc{exit} +$top.bind "space", proc{exit} + +$spool_size = 0 +def check + size = File.size($spool) + if size and size != $spool_size + pop_up if size > 0 + end + Tk.after 5000, proc{check} +end + +def pop_up + outcount = 0; + $spool_size = File.size($spool) + $list.delete 0, 'end' + f = open($spool, "r") + while !f.eof + mail = Mail.new(f) + date, from, subj = mail.header['Date'], mail.header['From'], mail.header['Subject'] + continue if !date + y = m = d = 0 + y, m, d = parsedate(date) if date + from = "sombody@somewhere" if ! from + subj = "(nil)" if ! subj + from = decode_b(from) + subj = decode_b(subj) + $list.insert 'end', format('%-02d/%02d/%02d [%-28.28s] %s',y,m,d,from,subj) + outcount += 1 + end + f.close + if outcount == 0 + $list.insert 'end', "You have no mail." + end + $top.deiconify + Tk.after 2000, proc{$top.withdraw} +end + +check +Tk.mainloop diff --git a/sample/tkbrowse.rb b/sample/tkbrowse.rb new file mode 100644 index 0000000000..dbaa132d1f --- /dev/null +++ b/sample/tkbrowse.rb @@ -0,0 +1,69 @@ +#!/usr/local/bin/ruby +# +# This script generates a directory browser, which lists the working +# directory and allows you to open files or subdirectories by +# double-clicking. + +# Create a scrollbar on the right side of the main window and a listbox +# on the left side. + +require "tkscrollbox" + +list = TkScrollbox.new { + relief 'raised' + width 20 + height 20 + setgrid 'yes' + pack +} + +# The procedure below is invoked to open a browser on a given file; if the +# file is a directory then another instance of this program is invoked; if +# the file is a regular file then the Mx editor is invoked to display +# the file. + +def browse (dir, file) + if dir != "." + file="#{dir}/#{file}" + if File.isdirectory? file + system "browse #{file} &" + else + if File.isfile? file + if ENV['EDITOR'] + system format("%s %s&", ENV['EDITOR'], file) + else + sysmte "xedit #{file}&" + end + else + STDERR.print "\"#{file}\" isn't a directory or regular file" + end + end + end +end + +# Fill the listbox with a list of all the files in the directory (run +# the "ls" command to get that information). + +if $ARGV.length>0 + dir = $ARGV[0] +else + dir="." +end +list.insert 'end', *`ls #{dir}`.split + +# Set up bindings for the browser. + +list.focus +list.bind "Control-q", proc{exit} +list.bind "Control-c", proc{exit} +list.bind "Control-p", proc{ + print "selection <", TkSelection.get, ">\n" +} + +list.bind "Double-Button-1", proc{ + for i in TkSelection.get.split + print "clicked ", i, "\n" + browse dir, i + end +} +Tk.mainloop diff --git a/sample/tkdialog.rb b/sample/tkdialog.rb new file mode 100644 index 0000000000..e83e16d0a8 --- /dev/null +++ b/sample/tkdialog.rb @@ -0,0 +1,62 @@ +#! /usr/local/bin/ruby +require "tk" + +root = TkFrame.new +top = TkFrame.new(root) { + relief 'raised' + border 1 +} +msg = TkMessage.new(top) { + text "File main.c hasn't been saved to disk since \ +it was last modified. What should I do?" + justify 'center' + aspect 200 + font '-Adobe-helvetica-medium-r-normal--*-240*' + pack('padx'=>5, 'pady'=>5, 'expand'=>'yes') +} +top.pack('fill'=>'both') +root.pack + +bot = TkFrame.new(root) { + relief 'raised' + border 1 +} + +TkFrame.new(bot) { |left| + relief 'sunken' + border 1 + pack('side'=>'left', 'expand'=>'yes', 'padx'=>10, 'pady'=> 10) + TkButton.new(left) { + text "Save File" + command "quit 'save'" + pack('expand'=>'yes','padx'=>6,'pady'=> 6) + top.bind "Enter", proc{state 'active'} + msg.bind "Enter", proc{state 'active'} + bot.bind "Enter", proc{state 'active'} + top.bind "Leave", proc{state 'normal'} + msg.bind "Leave", proc{state 'normal'} + bot.bind "Leave", proc{state 'normal'} + Tk.root.bind "ButtonRelease-1", proc{quit 'save'} + Tk.root.bind "Return", proc{quit 'save'} + } +} +TkButton.new(bot) { + text "Quit Anyway" + command "quit 'quit'" + pack('side'=>'left', 'expand'=>'yes', 'padx'=>10) +} +TkButton.new(bot) { + text "Return To Editor" + command "quit 'return'" + pack('side'=>'left', 'expand'=>'yes', 'padx'=>10) +} +bot.pack +root.pack('side'=>'top', 'fill'=>'both', 'expand'=>'yes') + +def quit(button) + print "aaa\n" + print "You pressed the \"#{button}\" button; bye-bye!\n" + exit +end + +Tk.mainloop diff --git a/sample/tkfrom.rb b/sample/tkfrom.rb new file mode 100644 index 0000000000..4a0d8c2b5d --- /dev/null +++ b/sample/tkfrom.rb @@ -0,0 +1,115 @@ +#! /usr/local/bin/ruby + +require "parsedate" +require "base64" + +include ParseDate + +class Mail + def Mail.new(f) + if !f.is_kind_of?(IO) + f = open(f, "r") + me = super + f.close + else + me = super + end + return me + end + + def initialize(f) + @header = {} + @body = [] + while f.gets() + $_.chop! + continue if /^From / # skip From-line + break if /^$/ # end of header + if /^(\S+):\s*(.*)/ + @header[attr = $1.capitalize] = $2 + elsif attr + sub(/^\s*/, '') + @header[attr] += "\n" + $_ + end + end + + return if ! $_ + + while f.gets() + break if /^From / + @body.push($_) + end + end + + def header + return @header + end + + def body + return @body + end + +end + +$ARGV[0] = '/usr/spool/mail/' + ENV['USER'] if $ARGV.length == 0 + +require "tk" +list = scroll = nil +TkFrame.new{|f| + list = TkListbox.new(f) { + yscroll proc{|idx| + scroll.set *idx + } + relief 'raised' +# geometry "80x5" + width 80 + height 5 + setgrid 'yes' + pack('side'=>'left','fill'=>'both','expand'=>'yes') + } + scroll = TkScrollbar.new(f) { + command proc{|idx| + list.yview *idx + } + pack('side'=>'right','fill'=>'y') + } + pack +} +root = Tk.root +TkButton.new(root) { + text 'Dismiss' + command proc {exit} + pack('fill'=>'both','expand'=>'yes') +} +root.bind "Control-c", proc{exit} +root.bind "Control-q", proc{exit} +root.bind "space", proc{exit} + +$outcount = 0; +for file in $ARGV + continue if !File.exists?(file) + f = open(file, "r") + while !f.eof + mail = Mail.new(f) + date, from, subj = mail.header['Date'], mail.header['From'], mail.header['Subject'] + continue if !date + y = m = d = 0 + y, m, d = parsedate(date) if date + from = "sombody@somewhere" if ! from + subj = "(nil)" if ! subj + from = decode_b(from) + subj = decode_b(subj) + list.insert 'end', format('%-02d/%02d/%02d [%-28.28s] %s',y,m,d,from,subj) + $outcount += 1 + end + f.close +end + +limit = 10000 +if $outcount == 0 + list.insert 'end', "You have no mail." + limit = 2000 +end +Tk.after limit, proc{ + exit +} +Tk.mainloop diff --git a/sample/tkhello.rb b/sample/tkhello.rb new file mode 100644 index 0000000000..1ff1403e71 --- /dev/null +++ b/sample/tkhello.rb @@ -0,0 +1,13 @@ +require "tk" + +TkButton.new { + text 'hello' + command proc{print "hello\n"} + pack('fill'=>'x') +} +TkButton.new { + text 'quit' + command 'exit' + pack('fill'=>'x') +} +Tk.mainloop diff --git a/sample/tkline.rb b/sample/tkline.rb new file mode 100644 index 0000000000..843893b5d9 --- /dev/null +++ b/sample/tkline.rb @@ -0,0 +1,29 @@ +require "tkclass" + +$c = Canvas.new +$c.pack +$start_x = start_y = 0 + +def do_press(x, y) + $start_x = x + $start_y = y + $current_line = Line.new($c, x, y, x, y, 'fill' => 'gray') +end +def do_motion(x, y) + if $current_line + $current_line.coords $start_x, $start_y, x, y + end +end + +def do_release(x, y) + if $current_line + $current_line.coords $start_x, $start_y, x, y + $current_line.fill 'black' + $current_line = nil + end +end + +$c.bind("1", proc{|e| do_press e.x,e.y}) +$c.bind("B1-Motion", proc{|e| do_motion e.x,e.y}) +$c.bind("ButtonRelease-1", proc{|e| do_release e.x,e.y}) +Tk.mainloop diff --git a/sample/tktimer.rb b/sample/tktimer.rb new file mode 100644 index 0000000000..b8b3617646 --- /dev/null +++ b/sample/tktimer.rb @@ -0,0 +1,49 @@ +#!/usr/local/bin/ruby +# This script generates a counter with start and stop buttons. + +require "tk" +$label = TkLabel.new { + text '0.00' + relief 'raised' + width 10 + pack('side'=>'bottom', 'fill'=>'both') +} + +TkButton.new { + text 'Start' + command proc { + if $stopped + $stopped = FALSE + tick + end + } + pack('side'=>'left','fill'=>'both','expand'=>'yes') +} +TkButton.new { + text 'Stop' + command proc{ + $stopped = TRUE + } + pack('side'=>'right','fill'=>'both','expand'=>'yes') +} + +$seconds=0 +$hundredths=0 +$stopped=TRUE + +def tick + if $stopped then return end + Tk.after 50, proc{tick} + $hundredths+=5 + if $hundredths >= 100 + $hundredths=0 + $seconds+=1 + end + $label.text format("%d.%02d", $seconds, $hundredths) +end + +root = Tk.root +root.bind "Control-c", proc{root.destroy} +root.bind "Control-q", proc{root.destroy} +Tk.root.focus +Tk.mainloop diff --git a/sample/trap.pl b/sample/trap.pl deleted file mode 100644 index ce022d4062..0000000000 --- a/sample/trap.pl +++ /dev/null @@ -1,6 +0,0 @@ -$SIG{'INT'} = 'test'; - -while (<>) { - print; -} -sub test { print "C-c handled\n"; } diff --git a/sample/trap.rb b/sample/trap.rb deleted file mode 100644 index e552a0fddc..0000000000 --- a/sample/trap.rb +++ /dev/null @@ -1,3 +0,0 @@ -trap('print("C-c handled\n")', 'INT', 'HUP') -print("---\n") -while gets(); print($_) end diff --git a/sample/tt.rb b/sample/tt.rb deleted file mode 100644 index f4960feaea..0000000000 --- a/sample/tt.rb +++ /dev/null @@ -1,100 +0,0 @@ -module Print - print("in Print\n") - def println(*args) - for a in args - print(a) - end - print("\n") - end - - def println2(*args) - print(*args) - print("\n") - end -end - -module Print2 - def println(*args) - print("pr2: "); - super - end -end - -module Print3 - include Print2 - def println(*args) - print("pr3: "); - super - end -end - -include Print, Print2, Print3 - -println2("in TopLevel") - -print("a: ", $OPT_test, "\n") -printf("%10.5g: %*s -> 0x%x\n", 123345, -10, Print, Print.id); - -println("a+ matches aaa at ", "bccAAaaa" =~ /a+/) -ttt = "this is a " -if offset = (ttt =~ /this ([^ ]*) (.*)/) - println("0 = ", $&); - println("1 = ", $1); - println("2 = ", $2); -end - -class Fib : Object - print("in Fib:Object\n") - - def Fib.test(*args) - println("in Fib.test") - - if args; println(*args) end - args = args.grep(/^c/) - super(*args) - end - - def init - println("in Fib.init"); - end - - def fib(n) - a =0; b = 1 - - while b <= n - c = a; a = b; b = c+b - end - return b - end -end - -def Object.test(*args) - println("in Object.test") - if args; println(*args) end -end - -Fib.test("abc", "def", "aaa", "ccc") -println("1:", 0x3fffffffa) -println("2:", 0x3ffffffa) -#println("3:", 0x40000000+0x40000000) - -fib = Fib.new - -fib.init -print(Fib, ":") - -#for i in 1 .. 100 -# fib.fib(90000) -#end - -println(fib.fib(9000)) - -def tt - for i in 1..10 - println("i:", i); - yield(i); - end -end - -test = tt() {|i|break if i == 2} -println([1,2,3,4].join(":")) -- cgit v1.2.3