Cafe Versioin 2.2
山田邦博です。
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
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735