山田邦博です。

Cafe の version up です。 Version 2.2 となりました。

複素数を手軽に扱える(RPN)関数電卓です。
電気・電子工学の研究開発に携わる研究者、技術者のためのものです。

今回の主な変更は、Scalar 値を取り扱う unary および binary operator に
関しては、配列の各要素への自動適用が可能になったことです(関数定義で
array expandable が宣言されている場合)。

詳細は下記 web ペイジを参照して下さい。
        http://www.tksa.gr.jp/king/Software/Cafe/Cafe.html

-...-

本投稿は 2部に分けます。
        DOC     (diff)(この投稿)
        BIN     (diff+shar)

-...-

アーカイブ:
----------
Cafe Ver.2.2 の全てのファイルは
        ftp://ftp.tksa.gr.jp/king/Cafe/Cafe_2.2.tgz
にあります。

最新の Cafe (patch 版を含む)については
       http://www.tksa.gr.jp/king/Software/Cafe/
からたどって下さい。

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=


##### (BEGIN) cut here for documents #####
diff -ur Cafe_2.2-pre.1/doc/BNF.txt Cafe_2.2/doc/BNF.txt
--- Cafe_2.2-pre.1/doc/BNF.txt  2004-01-01 16:10:12.000000000 +0900
+++ Cafe_2.2/doc/BNF.txt        2004-11-18 22:19:20.000000000 +0900
@@ -1,4 +1,4 @@
-This is BNF(Bakus-Naur Form) of Cafe Ver.2.1.
+This is BNF(Bakus-Naur Form) of Cafe Ver.2.2.
 ---------------------------------------------
 
 <letter> ::= [a-zA-Z]            # is one of upper or lower case of alphabets
@@ -22,11 +22,11 @@
 <real_number>    ::= <fixed_number>
                | <fixed_number><exponent_mark><exponent_part>
 
-<specieal_unary_operator> ::= '+' | '-' | '!' | '~'
-<specieal_binary_operator> ::= '//' | '.*' | '+' | '-' | '*' | '%'
+<special_unary_operator> ::= '+' | '-' | '!' | '~'
+<special_binary_operator> ::= '//' | '.*' | '+' | '-' | '*' | '%'
                           | '/' | '^' | '.' | '&' | '|'
                           | '==' | '>=' | '>' | '<=' | '<' | '!='
-<specieal_reduction_operator> ::= '/+' | '/*' | '/.*'
+<special_reduction_operator> ::= '/+' | '/*' | '/.*'
 <stack_inserting_modifier>  ::= '+:' | ':'
 <stack_extracting_modifier> ::= '-:+' | '-:' | '=:'
 
@@ -35,11 +35,11 @@
 <mnemonic_operator> ::= <ID>               # is defined to be an operator.
 <mnemonic_function> ::= <ID>               # is defined to be a function.
 
-<unary_operator>  ::= <specieal_unary_operator> | <mnemonic_unary_operator>
-<binary_operator> ::= <specieal_binary_operator> | <mnemonic_binary_operator>
+<unary_operator>  ::= <special_unary_operator> | <mnemonic_unary_operator>
+<binary_operator> ::= <special_binary_operator> | <mnemonic_binary_operator>
 <operator>         ::= <mnemonic_operator>
 <function>         ::= <mnemonic_function>
-<reduction> ::= <specieal_reduction_operator>
+<reduction> ::= <special_reduction_operator>
            | '/'<binary_operator> | '/'<operator>
 
 <variable> ::= <ID>        # is defined by user.
@@ -83,6 +83,8 @@
 <function_call> ::= <function> | <function> <expression>
                | <function> '(' <expression_list> ')'
 <exp_element> ::= <expression> | <reference><varcon>
+             | <reference><special_binary_operator>
+             | <reference><special_unary_operator>
 <exp_list> ::= <exp_element> | <exp_list> ',' <exp_element>
 <expression_list> ::= <null> | <exp_list>
 
@@ -126,13 +128,16 @@
 <do_command> ::= do '{' <command> '}' while '(' <bool> ')'
 
 <def_command> ::= <def_variable> | <def_constant>
-             | <def_binary> | <def_operator> | <def_function>
+             | <def_unary> | <def_binary> | <def_operator> | <def_function>
 <def_variable> ::= def <variable> | def <variable> '=' <expression>
 <def_constant> ::= def <constant> '==' <expression>
+<def_unary> ::= def <mnemonic_unary_operator> '(' <local_ID> ')'
+                       <array_extension> '=' '{' <expression> '}'
 <def_binary> ::= def '(' <local_ID> ')' <mnemonic_binary_operator>
                     '(' <local_ID> ')'
-                    <priority> '=' '{' <expression> '}'
+                    <priority> <array_extension> '=' '{' <expression> '}'
 <priority> ::= <number> | <null>     # priority of binary operator
+<array_extension> ::= 'array_expandable' | 'arrayex' | 'ax' | <null>
 <def_operator> ::= def <mnemonic_operator> '(' <argument_list> ')'
                        '=' '{' <command> '}'
                                # only one result should be put on the stack
@@ -148,6 +153,6 @@
 
 
 .-.-.
-1 Jan.2004
+18 Nov.2004
 
 YAMADA Kunihiro <king@tksa.gr.jp>
diff -ur Cafe_2.2-pre.1/doc/BUGS.jp.txt Cafe_2.2/doc/BUGS.jp.txt
--- Cafe_2.2-pre.1/doc/BUGS.jp.txt      2004-01-03 14:28:58.000000000 +0900
+++ Cafe_2.2/doc/BUGS.jp.txt    2004-11-23 23:14:51.000000000 +0900
@@ -1,4 +1,4 @@
-Cafe Version 2.1 におけるこれまでに分かっているバグおよび使用上
+Cafe Version 2.2 におけるこれまでに分かっているバグおよび使用上
 の注意を以下に記しておきます。
 
 -...-
@@ -60,8 +60,20 @@
 ver.2.0 に付属していた diagnosis.cafe は Cafe ver.2.1 で使用できなくな
 りました。 (Cafe ver.2.1 に付属のものを使用して下さい。)
 
+  Cafe ver.2.2 から関数(unary and binary operator)に array expandable を
+定義できますが、その関数の引数として array を要求するものは動作しません。
+これは、array expandabe が定義されている時、引数が array だと、その
+array の最終要素(つまり scalar)にまで分解して、その関数を呼び出すからで
+す。 これは、その関数の実行時以前には分かりません。
+
+  リテラルとしての数値および文字列の reference は表現できません。 必要な
+ら一旦変数に代入してから reference を表現して下さい。
+       ex.  @3.1416    # エラー
+            @"error" # エラー
+            @'error'   # エラー
+            @pi        # 正常:スタックに積まれる。
 .-.-.
-3 Jan.2003
+23 Nov.2003
 
 山田邦博
 YAMADA Kunihiro <king@tksa.gr.jp>
diff -ur Cafe_2.2-pre.1/doc/MUMBLE.jp.txt Cafe_2.2/doc/MUMBLE.jp.txt
--- Cafe_2.2-pre.1/doc/MUMBLE.jp.txt    2003-12-24 14:56:04.000000000 +0900
+++ Cafe_2.2/doc/MUMBLE.jp.txt  2004-11-23 23:39:25.000000000 +0900
@@ -100,9 +100,18 @@
 いと考えている。(少なくとも現在のハードウェアのレベルでは)
 15年位将来なら実用性の可能性はあるんでしょうが。
 
+-...-
+
 Cafe Ver.2.1 で fft, ifft を unary operator 化したが、これは array を演
 算対象にする前ぶれ。 Ver.3.0 以降で実装かな?(ハードウェア次第?)
 
+いやいや、Ver.2.2 で導入してしまったよ。 Scalar 変数を演算対象とする
+unary operator と binary operator に関しては array expandable を定義でき
+るようにした。 Ver.2.2 で提供される binary operator は全て array
+expandable であるし、unary operator の多くが array expandable として定義
+されている。 なんか object oriented の手法を取り入れたかって? いや、
+Cafe にはそんな物は無縁だ。 極自然な発想、手法だ。
+
 -...-
 
 従来(Ver.2.0 およびそれ以前)、reference の先の実体が undef 等でなくな
@@ -140,6 +149,12 @@
 
 -...-
 
+私が使ったことのない binary operator が一個だけあった。 それは "%" だ。
+"mod" を使うことは良くある。 将来の version で "%" を別の用途に使い出す
+かも知れないな。
+
+-...-
+
 Cafe も Version 2.0 で私が欲しいものはほぼ出尽くしたな。 今後 10年以上
 に渡って日常的に使う事になるだろう。
 
@@ -149,8 +164,14 @@
 Reference を整理したのは、機能低下だが、バグ等の余計な心配の種を事前に
 摘んだので私的には満足。
 
+Version 2.2 での array への演算子適用は、やはり必要になってしまったので
+追加した。 ただし unary operator と binary operator に限定した。
+私はこんな利用が多い;
+       $real_array1 + j $real_array2
+関数を一発書けば可能だが、この方がスマートでしょう。
+
 .-.-.
-24 Dec.2003
+23 Nov.2004
 
 山田邦博
 YAMADA Kunihiro <king@tksa.gr.jp>
diff -ur Cafe_2.2-pre.1/doc/README.jp.txt Cafe_2.2/doc/README.jp.txt
--- Cafe_2.2-pre.1/doc/README.jp.txt    2004-11-05 00:57:38.000000000 +0900
+++ Cafe_2.2/doc/README.jp.txt  2004-12-01 18:18:34.000000000 +0900
@@ -5,7 +5,7 @@
 
                                山田邦博
                    YAMADA Kunihiro <king@tksa.gr.jp>
-                        4 Nov.2004 (Release 2.2-pre.1)
+                        1 Dec.2004 (Release 2.2)
                     Copyright policy: GNU GPL Ver.2
 
 
@@ -23,17 +23,22 @@
 並列回路のインピーダンス表現のための binary operator "//" が用意されて
 います。 また、掛け算記号 "*" を省略できます。 FFT も入っています。
 
+  Scalar 値を取り扱う unary および binary operator に関しては、配列の
+各要素への自動適用が可能です(関数定義で array expandable が宣言されて
+いる場合)。(Ver.2.2 より) 
+
   強力なヘルプ機能を付けました。 ユーザ定義の関数はその定義を表示させ
 ることができます。 また、関数や変数の定義に付属したコメントを表示させ
 ることができます。 さらに、それらのコメントを検索できます。
 エラー発生時にはバックトラックが行われ、その原因と場所が表示されます。
 
-Cafe Ver.2.2-pre.1 の全てのファイルは
-       ftp://ftp.tksa.gr.jp/king/Cafe/Cafe_2.2-pre.1.tgz
+
+Cafe Ver.2.2 の全てのファイルは
+       ftp://ftp.tksa.gr.jp/king/Cafe/Cafe_2.2.tgz
 にあります。
 
 最新の Cafe については
-       http://www.tksa.gr.jp/king/Software/Cafe/
+       http://www.tksa.gr.jp/king/Software/Cafe/
 からたどって下さい。
 
 
@@ -66,12 +71,12 @@
 (MUMBLE.jp.txt を参照)
 
 
-Version 2.2-pre.1 での変更点:
-----------------------------
-・システム内蔵の算術 binary operator の一部について、配列に対応した。
-  対応した operator は "*","/","+","-","^","%","//" および blank
-  operator である。 これらの operator に関しては operand の一方あるいは
-  両方が配列であることが許される。
+Version 2.2 での主な変更点:
+---------------------------
+・Scalar 値を演算対象とした unary operator および binary operator につ
+  いて、array_expandable (arrayex,ax と略記可)が宣言されていると、
+  (binary operator の場合は少なくとも一方の)被演算子が配列であった場合、
+  全ての配列要素に演算子を作用する。 結果は一個の配列となる。
 
 
 Version 2.1 での主な変更点:
@@ -297,9 +302,13 @@
 される。
 
   Apropos は、コメント行および、変数名、関数名から検索する。
-Apropos の引数として "binary" を指定すると、全ての binary operator が
-検索される。 また引数として "constant" を指定すると、全ての定数を検索
-する。
+Apropos の引数として "Nullary", "Unary", "Binary" または "Constant" を指
+定すると、それぞれ、全ての nullary operator, unary operator, binary
+operator または定数が検索される。
+また、引数として "array_expandable", "array expandable" または
+"arrayex" を指定すると、全ての array expandable unary operators と
+array expandable binary operators が検索される。
+
 Apropos の引数の文字列には大文字小文字の区別がありません。 さらに、メ
 タ記号は "*" を除き全て使えなくしてあります。(単なる文字として扱われる)
 "*" は 0 字以上の任意の文字列を表します。
@@ -497,7 +506,7 @@
 ----
   関数の内、Binary operator については後述する。
 関数の定義形式は
-    def func(parameter_list)={command_list}    # comment
+    def func(parameter_list)array_expandable={command_list}    # comment
 である。
 
 Parameter_list は 0 個以上のローカル変数をカンマ "," で区切ったもので
@@ -511,16 +520,31 @@
 
 Command_list は 0 個以上のコマンドを ";" で区切って並べた物である。
 
+array_expandable を指定できるのは unary operator の場合だけである。
+array_expandable の指定がある場合、この Unary operator が配列拡張可能
+(array expabdable)であることを宣言している。 "array_expandable" は
+"arrayex","ax" と略記可能である。 (参照:配列拡張可能演算子の項)
+
 
 Binary operator:
 ---------------
   Binary operator は引数が 2 個の関数の特別な場合である。
 Binary operator であることを視覚的に訴えるような形態を採用した。 その
 定義形式は
-    def ($left)binop($right)priority={command_list}    # comment
+
+    def ($left)binop($right)priority array_expandable={command_list} \
+               # comment
 である。
+
 Binary operator では call by name を許していない。($left,$right に @
 を付けることはできない。)
+array_expandable の指定がある場合、この binary operator が配列拡張可能
+(array expabdable)であることを宣言している。 "array_expandable" は
+"arrayex","ax" と略記可能である。 (参照:配列拡張可能演算子の項)
+なお、priority は数字だけ、array_expandable には数字がないので、この両者
+の間にスペースを入れなくても良い。(区別できる)
+
+
 式の中で
     x binop y
 と使用されると、x が $left に y が $right にそれぞれコピーされてから
@@ -529,7 +553,8 @@
 る。(Default は 9999)
 
   システム内蔵および define.cafe で定義の binary operator とその
-priority を以下に示す;
+priority を以下に示す(なお、これらは全て array expandable として定義さ
+れている);
 
        記号   Priority   機能
      -------------------------------------------
@@ -627,6 +652,9 @@
        join    Join character elements of array into single string
                (引数は文字列の配列、結果は文字列)
 
+  "apropos unary" とコマンドを入れると、全ての unary operator のコメント
+が表示されます。
+
 
 Nullary operator:
 ----------------
@@ -643,6 +671,64 @@
        null_array      Make null array
        undefined_value Make undefined value
 
+  "apropos nullary" とコマンドを入れると、全ての nullary operator のコメ
+ントが表示されます。
+
+
+配列拡張可能演算子(Array expandable operator):
+---------------------------------------------
+  Operand が scalar(複素数または文字列)である unary operator および
+binary operator は、その演算を配列に拡張可能である。 ただし、array
+expandable であることが定義されていなければならない。
+(この機能は Cafe ver.2.2 から実装された。)
+
+  Binary operator の例を示そう。 良く知られている加算演算 "+" の典型例は
+       $ans = $left + $right
+で、$ans, $left および $right は各々複素数である。
+この "+" は array expandable として定義されていて、$left または $right
+の少なくとも一方が配列の場合、結果の $ans も配列となる。 配列の配列も許
+され、多次元を扱える。
+
+両方が配列の場合、双方の配列構造は同一でなければならない。 また、その時
+の結果の配列構造も同一となる。 演算は各配列の対応する要素同士で行なわれ、
+結果も対応する配列の要素位置となる。
+例えば、
+       $left  = ({1;2;3;shrink})       # Cafe 流の配列表記方法
+       $right = ({4;5;6;shrink})
+ならば
+       $ans   = ({5;7;9;shrink})
+と同一になる。
+
+Operand の一方だけが配列の場合、その配列の全要素に他方の scalar 値と演算
+され、同一配列構造の配列が結果となる。
+例えば、
+       $array = ({10;20;30;shrink})
+ならば、
+       $ans = $array + 1
+または
+       $ans = 1 + $array
+は
+       $ans = ({11;21;31;shrink})
+と同一になる。
+
+  次に unary operator の例を示そう。 Complex conjugate "~" の使用典型例
+は
+       $ans = ~ $operand
+であり、$ans および $operand は複素数である。
+この "~" は array expandable として定義されていて、$operand が配列の場合、
+結果の $ans も同一構造の配列となる。
+例えば、
+       $operand = ({1+0.1j;2+0.2j;3+0.3j;shrink})
+ならば
+       $ans     = ({1-0.1j;2-0.2j;3-0.3j;shrink})
+と同一となる。
+
+  'apropos array_expandable' とコマンドを入れると、全ての array
+expandable unary operators と array expandable binary operators の各関
+数名とそのコメントが表示されます。
+array_expandable は arrayexpandable, "array expandable" あるいは
+arrayex と書いても良い。
+
 
 コマンドと式:
 ------------
@@ -832,6 +918,10 @@
        となります。 エラーがなければスタックをリストアし、演算結果を
        最後に追加します。
 
+       この機能の利用方法として、
+               ({1;2;3;4;5;shrink})
+       とすることで配列を表現できます。 (Cafe ver.2.1 より)
+
 式の中で使用できないようなスタック操作を含む関数は、コマンドレベルで単
 独であるいはその引数のみを持つものだけが許されます。
 そのような関数の実行では、スタックがセイブされ、隠蔽されるような事はなく、
@@ -1131,9 +1221,13 @@
     3:"two"          # "three","one","two"
     1-:+               # "one","two","three"
 
+    $x = ({10;20;30;40;shrink})        # 配列: 10,20,30,40
+    $y = ({9;8;7;6;shrink})    # 配列: 9,8,7,6
+    $x + j $y                  # 結果は配列; 10+9j,20+8j,30+7j,40+6j
+
 
 その他:
 ------
   著作権は GNU GPL Version 2 に準じます。(GPL-2 参照)
   無保証です。
-  バグレポート、意見等は歓迎します。
+v  バグレポート、意見等は歓迎します。
diff -ur Cafe_2.2-pre.1/doc/TODO.jp.txt Cafe_2.2/doc/TODO.jp.txt
--- Cafe_2.2-pre.1/doc/TODO.jp.txt      2004-01-29 22:01:16.000000000 +0900
+++ Cafe_2.2/doc/TODO.jp.txt    2004-11-19 23:38:38.000000000 +0900
@@ -8,8 +8,12 @@
        ずなのだが。
        誰か作ってくれると嬉しい。
 
-Array への演算子適用。
-       現在の演算速度では中途半端かな?
+Array への reduction 適用。
+       現在の reduction は stack に適用される。 Reduction operator を
+       unary operator 扱い出来るように拡張する。
+       /op の "/" を別にする必要があるかな? "%op $array" でどうか? この
+       場合は既にある binary operator "%" を例えば "residual" に変える
+       ことになるが。
 
 Reference の一般化。
        ようは現在禁止している referenced value の変数への代入を、許す
@@ -21,7 +25,7 @@
        今しばらくは考えない事にする。
 
 .-.-.
-29 Jan.2004
+19 Nov.2004
 
 山田邦博
 YAMADA Kunihiro <king@tksa.gr.jp>
diff -ur Cafe_2.2-pre.1/doc/change.log Cafe_2.2/doc/change.log
--- Cafe_2.2-pre.1/doc/change.log       2004-11-05 01:23:25.000000000 +0900
+++ Cafe_2.2/doc/change.log     2004-12-01 18:19:24.000000000 +0900
@@ -1,8 +1,58 @@
+1 Dec.2004
+       Version 2.2 : released.
+
+22 Nov.2004
+       Cafe.pm: flush_un_stack while flush_cmdln.
+
+20 Nov.2004
+       added bin/fix-new-version.sh
+
+19 Nov.2004
+       Cafe.pm: @RESERVED_ID: added reserved id
+                       constant nullary unary binary array_expandable
+
+18 Nov.2004
+       BNF.txt: added <reference><special_binary_operator> and 
+                      <reference><special_unary_operator> to <exp_element>
+                corrected typo.
+       paren: added referenced special binary and unary operators
+       op_apropos: added key word "Nullary"
+       diagnosis.cafe: added checking code for array expandable operators
+       define.cafe: added unary operator "pos" (same as unary "+").
+       README.jp.tx: added new keyword "Nullary" and "Unary" for pc,pd
+       and apropos.
+
+14 Nov.2004
+       c_def: checking for hiden comment "Unary"
+       op_apropos: added retrieving key "Unary" for only unary operators.
+
+12 Nov.2004
+       modified op_apropos for array expandable.
+       README.jp.txt: added new future (array expandable).
+
+7 Nov.2004
+       BNF.txt: modified for new future (array expandable).
+       added arrayex(array extension for Unary or Binary operator) key to
+       complex variable.
+       array expanded for execute_function.
+       replaced _op_bin_arith with older(ver 2.1)
+       added setsysunary function.
+       modified setsysbin (added arrayex).
+       modified op_print_comment,op_print_function_definition and
+       op_apropos for adding arrayex.
+       modified c_def for array expansion.
+       modified function registration call.
+               replaced setsysfunc with setsysunary for array expandable
+               unary operators.
+               added arrayex parameter when setsysbin is called.
+       define.cafe: added ax(array expandable) parameter for array
+       expandable unary and binary operators.
+
 5 Nov.2004
-       Version 2.2-pre.1 : release
+       Version 2.2-pre.1 : pre-released.
 
 24 Oct.2004
-       expand arithmetic operators for array.
+       expanded arithmetic operators for array.
 
 31 Jan.2004
        Version 2.1-patch.1 : released