# Program of CALC : Make Calender. # 指定された年のカレンダーを作成します。 # ただし祝日などは考慮されません。 exit calendar(); function calendar(){ var year, month; clear(); println("指定された年の一年のカレンダーをつくります。"); println("遠い昔やはるかな未来でもちゃんと合っているかどうかは自信がありません。"); print("年を西暦で入力して下さい。"); year = (int)input("西暦 何年 ? "); if(year === error){ exit "年の値が解釈できませんでした。終了します。"; } for(month = 1; month <= 12; month++){ drawmonth(year, month); } return "西暦" + year + "年のカレンダーでした。"; } static printstyle = false; // 1回だけ実行するための実行記憶。(全部で12回呼ばれる。) function drawmonth(year, month){ var tuki_e = ['', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; var tuki_j = ['', '睦月', '如月', '弥生', '卯月', '皐月', '水無月', '文月', '葉月', '長月', '神無月', '霜月', '師走']; var youbi = ['日', '月', '火', '水', '木', '金', '土']; // カレンダーをテーブルタグを使って書き出します。タグを使うときの注意事項をいくつか。 // タグは終了タグまで一回のprint()で書き出します。 // そうしないとブラウザが勝手に終了タグを追加しておかしな表示になることがあります。 // スタイル指定をするときはタグ名での指定はせずidかclassかあるいはインラインスタイル指定を使ってください。 // そうしないとCALCの表示に影響を与える場合があります。 if(!printstyle){ //
は数が多いのでまとめてスタイル指定しておきます。数字(日付)を右寄せにします。 print(''); printstyle = true; } var printstr; // タグを使う場合終了タグまで一式すべて変数printstrにためてタグを完結させてから書き出します。 // カレンダーの枠とタイトル(何年何月)を書き出します。 printstr = '
'; printstr += '
' + year + '年 ' + month + '月 ' + tuki_j[month] + ' (' + tuki_e[month] + ')
'; // 曜日タイトル(日、月、火、...)を書き出します。 printstr += '
'; var yb; printstr += '
' + youbi[0] + '
'; // 日曜日は赤で。 for(yb = 1; yb < 6; yb++){ printstr += '
' + youbi[yb] + '
'; } // 普通の日はたぶん黒。 printstr += '
' + youbi[yb] + '
'; // 土曜日は土色で。 printstr += '
'; // 月の日数と月の初日の曜日を取得します。 var maxday = monthday(year, month); // 月の日数。 var startweekday = weeknum(year, month, 1); // 初日の曜日。 var weekcycle, weekday, day; // 日付の部分を書き出しを開始します。 printstr += '
'; // 第一週目。途中から日付が入ります。 printstr += '
'; for(day = weekday = 0; weekday < 7; weekday++){ if(weekday >= startweekday){ if(weekday == 0){ printstr += '
' + (++day) + '
'; } else if(weekday == 6){ printstr += '
' + (++day) + '
'; } else{ printstr += '
' + (++day) + '
'; } }else{ printstr += '
'; } } printstr += ''; // 二週目以降。月の終わりまで。 for(weekcycle = 1; weekcycle <= 5; weekcycle++){ printstr += '
'; for(weekday = 0; weekday < 7; weekday++){ if(day < maxday){ if(weekday == 0){ printstr += '
' + (++day) + '
'; } else if(weekday == 6){ printstr += '
' + (++day) + '
'; } else{ printstr += '
' + (++day) + '
'; } }else{ printstr += '
'; } } printstr += '
'; } printstr += '
'; // テーブルを閉めます。 // 表示を書き出します。 print(printstr); wait(100); // 少しwaitをいれるといかにもいっしょうけんめい作っている雰囲気が出ます。 } // 月の日数を求めます。 function monthday(year, month){ if(month == 2){ return( (year%4 == 0 && year%100 != 0 || year%400 == 0) ? 29 : 28); } else if(month == 4 || month == 6 || month == 9 || month == 11){ return(30); } else{ return(31); } } // 指定された年月日の曜日を番号で返します。0が日曜日です。 function weeknum(year, month, day){ var result; if(month <= 2){ --year; /* 1月と2月は閏年の処理の都合上 前年度とみなす。すなわち13月と14月とみなす */ month += 12; } /* 月の処理がポイント。Zeller の公式。 7で割ったあまりが曜日をしめす。0が日曜日。 */ result = (year + (int)(year/4) - (int)(year/100) + (int)(year/400) + (int)((13*month + 8)/5) + day) % 7; if(result < 0){ result += 7; } return(result); }
計算用紙 "CalcPad" V1.5
{ご案内}
CALC PROGRAM
プログラム
/
UTF8
SJIS
EUCJP
JIS7
-
/
-
CALC CONSOLE
グラフィック
1
初期化中です....
Simple Calculation Program "CalcPad" V1.5 (
http://kuragane.jp/calcpad.htm
)
CalcPad Information
CalcPadのご案内
◆ 概要 ◆
「計算用紙 CalcPad」(以下CALCと略)は気軽な計算などに軽く使えるよう作成したC言語類似のごく簡単なインタプリタです。
数値は複素数が使えるように拡張してあり、さらに変数、配列、関数、基礎的な制御構造なども使えます。またグラフィック機能もありSVGとcanvasを使って簡単なグラフや絵などを描くことができます。
CALCでは初期の構造化言語の基本機能はほぼ実装しており、プログラムを書いてすぐにその場で実行できますので、ちょっとした仕事の計算、遊びやプログラミングの勉強などには充分使えます。
以下、言語の概略説明です。
◆ 数値 ◆
数値は整数、浮動小数点数、
複素数
(虚数単位として"
i
"または"
j
")が使えます。整数はさらに通常の10進数表記のほかに2進数(例:%1101)、8進数(例:036)、16進数(例:0x3F)などの表記ができます。
◆ 常数 ◆
常数として
p
,
PI
:円周率 通称パイ(3.14159...)、
e
:自然対数の底(2.71828...)、
true
:真偽値の真、
false
:真偽値の偽、
null
:値なし、
error
:一部の演算子や関数がエラー通知に返す値、
void
:無効な(使えない)値(未定義、不定、ゴミ値など)、
undefined
:定義されていない値 が組み込まれています。
◆ 文字列 ◆
文字列は
''
または
""
で囲って表現します。文字列とコメントは内部に日本語を使うことができます。特殊文字として、
\(改行)
:改行打ち消し、
\\
:\そのもの、
\0
:ヌル文字、
\b
:バックスペース、
\t
:タブ、
\n
:改行、
\f
:フォームフィード、
\r
:復帰、
\'
:シングルクオート、
\"
:ダブルクオート、
\xhh
:16進コードhhの文字 が定義されています。
◆ 変数 ◆
変数の宣言の書式は キーワード 変数名[=値], ... ; の形で"=値"はconst宣言およびstatic宣言以外ではなくてもかまいません。
変数の値の型は内容に応じて自動的に設定されます。変数宣言は通常初期化時(static変数やconst常数)あるいは実行時(var変数)に登録されますが、実際に値が代入されて有効になります。
変数名に使用できる文字はアルファベット、数字、アンダスコア("_")ですが、頭はアルファベットまたは"_"で数字は除かれます。
変数名には制御用の語句(ifとかforとかいわゆる予約語)、その他組込の常数名や関数名などは使用できません。また最終的にはjavascriptで処理する場合もありえますのでjavascriptで意味をもつ語も使わないほうが安全です。
変数のスコープは、実行側(function宣言された)関数の引数や関数内でのみ使われる変数および関数内でglobal以外で宣言された変数は関数内ローカル変数となり、通常その関数内とその関数内で定義された関数内でのみ参照できます。それ以外の変数の検索は関数内から順次上位の関数、トップレベルへと行われます。
変数宣言は 宣言キーワード 変数名[=値], ... ; の形で以下のキーワードが使えます。
●
global
: 関数内からグローバル変数を参照します。globalに加えvarやconstなどの宣言をするか"="で値を指定すればグローバル領域に変数がなければ作られますが、関数内からグローバル変数をつくった場合その所有権は関数を離れエラー検知や制御等が充分できません。関数を再定義したり復数の関数で同じ変数を宣言したりするとバグの原因になりやすいです。
●
static
: 静的変数を宣言します。globalをつければ広域、なしで関数内なら局所変数になります。初期値の設定は変数の作成時(通常プログラム初期化時)に一回だけ行われます。すなわち同じ変数名のstatic変数の初期化を複数書いても有効な初期化は一つだけです。宣言時に"="で有効な値を指定する必要があります。いったん作成されたstatic変数はvarで再宣言するとか、delete()で関数ごとそっくり、あるいは個々に消去される場合を除き、関数が再実行されたりあるいは再定義されたり再初期化されても変数と値はそのまま残ります。
●
const
: 常数の作成を宣言します。必ず宣言時に"="で有効な値を指定してください。以後var等で再宣言しない限り値の変更はできません。
●
var
: 型可変型変数の作成を宣言します。なくても新しい変数名に値を代入すれば変数が作られますが最初に書いておくとわかりやすいですし、うっかりすでにあるグローバル変数と混同してしまう等のバグが避けられます。
その他キーワードとしてint, float, complex, string, booleanが使えますがこれらは現在はvarと同じ扱いになります(将来的には型指定型変数を導入しようなどと当初は考えていましたが...)。覚えの意味で使うなら問題ありません。
これらの宣言の属性は変数が新たな変数に代入されても必ずしも継承はされません。
変数の宣言についてはjavascript同様の宣言巻き上げを設定してありますので変数を使うところで都度宣言しても良いのですが、たよりにするとバグのもとになるかもしれません。変数宣言はなるべく関数の最初にやるようにしましょう。
関数の内部変数は実は関数実行終了後もそのまま残っており、メンバーアクセス演算子"
.
"を使って fncname.varname の形でアクセスできます。
また宣言は組み合わせて使うこともできますが、関数の内外や宣言場所含めてすべての組み合わせについて確実に確認したわけでもありません。
◆ 配列 ◆
配列も定義できます。書式は、配列名 = [値1, 値2, ...]; もしくは、配列名 =
array
(値1, 値2, ...);で、キーは指定しなければ0から初期化されます。ary=[[1,2,..],[3,4,..],..];などとして配列の中に配列を入れるのも可能です。[]内または()内は別途キー(必要なら)と値を定義するなら空でもかまいません。値のところは キー
=>
値, あるいは キー
:
値, としてキーと値を指定することも可能です。キーは0か正の整数、もしくは"."を含まない文字列(できるだけ名前文字に準じる)です。
配列要素の追加あるいは変更は 配列名[キー(空なら自動)] = 値; で行います。配列や配列要素の削除にはdelete()をお使いください。配列名はC言語と同じく常に参照値であり、オブジェクトとするjavascriptとは少し異なります。すなわち配列を別の変数に 代入演算子"
=
" で代入した場合や関数の引数として渡した場合、値のコピーではなく配列への参照値が渡されますので受け渡し先で要素を書き換えると元の配列が書き換わります。そうしたくない場合はなるべく最後のほうで "
copy
"を使って参照を解除してください。配列を再定義した場合は前の配列は自動的に消去されます。
◆ 関数 ◆
function
f(...){...}の形で関数を定義できます。定義には必ずfunction宣言が必要で()や{}は省略できません。実行はf(...)の形で行います。
関数については最後の方に少し詳しく書いてありますのでそれを参照してください。
◆ 制御構造 ◆
単純な文(式;)のほかに、制御構造(制御文)として if-else, for、foreach, while, do-while, switch-case, break, continue, return, exit および複合文{ } が使えます。使い方はC言語より派生した多くの言語と同じですので、ごくごく簡単な説明にとどめます。{ 実行式;... }の部分はswitch-caseを除き実行式;が1つだけならば無理に{}はいりませんが書いておいた方がわかりやすいです。
if
(条件式){ 実行式1;... }
else
{ 実行式2;... }
……
条件式が真のとき{ 実行式1;... }、偽のとき{ 実行式2;... }を実行します。条件式は省略できません。elseに続いてifを記述するときは
else if
と区切ってください(elseifとかelifというのは使えません)。
for
(初期化式; 条件式; 再初期化式){ 実行式;... }
……
最初初期化式を実行、続いて条件式が真なら{ 実行式;... }を実行、再初期化式を実行後再度条件式を評価し真なら再び{ 実行式;... }を実行、偽ならforは終わりとなります。forの初期化式、条件式、再初期化式は省略でき、条件式を省略した場合条件は真とみなされます。
foreach
(ary
as
[id
=>
] val){ 実行式;... }
……
配列aryの要素を順次valに取り出します(php方式です)。順番は制御できません。id => があればidに配列のインデックス(文字列)も取り出します。id, valは変数名であれば他の名前でもかまいません。配列の中の配列の値までは取り出しません。
while
(条件式){ 実行式;... }
……
条件式が真なら{ 実行式;... }を実行、偽ならwhileは終わりとなります。whileの条件式は省略できません。
do
{ 実行式;... }
while
(条件式);
……
無条件に一度{ 実行式;... }を実行、その後whileのあとの条件式を評価して真なら再度{ 実行式;... }を実行、偽ならdo-whileは終わりとなります。do-whileの条件式は省略できません。最後のwhile();の";"をお忘れなく。
switch
(比較値){
case
値1: 式1;...;
case
値2: 式2;...;
default
: 式d;...; };
……
比較値を各caseのあとの値と比較し同値ならそのあとの式;から(最後まで)実行します。合う値がなければdefault:のあとから(最後まで)実行します。一部だけ実行するならbreak;で流れを止めます。switch文の比較値と{}は省略できません。
break
;
……
for, foreach, while, do-while, switch-caseで途中で処理を止めコントロールを抜けるのに使用します。
continue
;
……
for, foreach, while, do-whileの途中で以後の処理を止め、再判定して真なら再度ループを実行します。
return
式;
……
関数内ならその関数を、そうでないならCALCを終了し式の値を返します。値を使わないなら式はなくてもかまいません。
exit
式;
……
全体(CALC)の処理を終了(停止)し式の値を返します。式はなくてもかまいません。
{
式; 式; ...
}
……
復数の文をまとめいわゆる複合文を形成します。あるいは制御構造や関数などの適合範囲を規定します。
これらの文や制御構造についてはC言語、php、javascriptなどとほとんど同じですので、概略おわかりになると思います。
◆ 演算子 ◆
以下の演算子が使えます。優先度は数字の大きいほど(下のものほど)高くなります。こちらもC言語、php、javascriptなどとほとんど同じですので、詳しくはそちらの参考書などをご覧ください。
優先度
演算子
書式
結合性
説明
0
式の区切り
;
左→
必ずしも演算子ではありませんが、式を区切っていわゆる文を形成します。式は空でもかまいません。CALCでは単純な文や制御文も値(概ね最後の実行結果)を返します(もともと式や文を書いて最後の結果を表示する計算用紙の動作を踏襲したため)。それでその値を式で使えないこともありませんが、その場合
必ず文や制御構造をそっくり()で囲んで式の中に入れてください
。()で囲わずそのまま入れますと式の処理が途中で中断されたりエラーになったり、場合によってはエラーにならずに式の結果がおかしな値になったりします。
1
順次演算子
,
左→
左から右へ順次式を評価し、最後の式の値をその値とします。空(",,"や",;"など)は許されません。関数などの引数の区切りの","とはちがいます。
2
代入演算子
(単純代入)
=
←右
変数(左辺値)に右辺値を代入します。数値及び文字列、論理値についてはその値が代入され、配列については配列への参照値が代入されます。配列の値そのものを代入したいなら 変数 = copy 配列名; とします。また関数名を変数に代入した場合
実行コードのみが代入され
、内部変数等は実行時に変数名所有で新しく作られます(同様に内部変数もコピーしたいなら 変数 = copy 関数名; とします)。
代入演算子
(演算代入)
+=
,
*=
,
/=
,
%=
,
**=
,
|=
,
^=
,
&=
,
<<=
,
>>=
,
>>>=
←右
変数(左辺値)に左辺値を右辺値で演算した結果を代入します。演算代入の場合演算によっては値は整数型でなくてはならないなどの制限がありますが、これについては該当する演算を参考にしてください。"+="では少なくとも片方が文字列の場合は文字列連結、それ以外では数値演算されます。
3
三項演算子
(条件演算子)
a
?
b
:
c
←右
aが真ならb, 偽ならcを値とします。三項演算子の中にさらに三項演算子を入れる場合は極力()を使ってください。言語によって結合性が異なります。CALCでは a ? b : c ? d : f はC言語やJava,javascript等と同じく a ? b : (c ? d : f) として処理されます。
4
論理和
||
左→
いずれかが真の値ならtrueを、すべて偽の値ならfalseを値とします。偽の値とは数値の0, 空文字列"", 空の配列[], 論理値のfalse, その他null, undefined(未定義), void, errorです。
5
論理積
&&
左→
すべて真の値ならtrueを、いずれかが偽の値ならfalseを値とします。
6
ビットOR
|
左→
ビットごとの論理和(少なくとも一方が1なら1、両方0なら0)をそのビットの値とします。整数にのみ適用できる演算です。
7
ビットXOR
^
左→
ビットごとの排他的論理和(一方だけが1なら1、両方0か1なら0)をそのビットの値とします。整数にのみ適用できる演算です。
8
ビットAND
&
左→
ビットごとの論理積(両方1なら1、少なくとも一方が0なら0)をそのビットの値とします。整数にのみ適用できる演算です。
9
等値比較
==
,
!=
,
===
,
!==
左→
等しいか否かの比較演算を行い結果としてtrueまたはfalseを返します。===, !==は型が等しいか否かの判定も含めますが数値同士なら型は同じとみなされます。たとえば 0 === 0.0 は数値型が違っても型は同じとみなされ値が同じなので真、型比較をしない 0 == false はともに偽の値なので結果は真、 型比較をする 0 === false は型が違うので偽となります。その他型が違う場合の比較は実際やってみて確認してください("0"==false、"1"==1 など)。
10
大小比較
>
,
<
,
>=
,
<=
なし
大小の比較演算を行い結果としてtrueまたはfalseを返します。=がある場合は同値も含めます。実数のみに適用でき複素数には適用できません。
11
ビットシフト
<<
,
>>
,
>>>
左→
左辺の整数を右辺の整数分ビット移動します。<<は左、>>は右、>>>は符号なし整数扱いで右シフトします。左辺値は整数、右辺値は0から31の整数です。
12
加減算
+
,
-
左→
算術演算の +:足し算、-:引き算です。それに加え + 演算は文字列の結合に使用します。
右辺か左辺のいずれかが文字列の場合
もう一方も文字列に変換され結合されます。
13
乗除算
*
,
/
,
%
,
*の省略形
左→
算術演算の *:掛け算、/:割り算、%:剰余算です。
加えて純粋な数値表現(変数,関数などと混同しないもの)あるいは括弧"(式)"に虚数単位iまたはjはもちろん、
eやEの指数表現と混同しない
変数名や括弧"(式)"が空白なしで続いたときは乗算記号"*"が省略されたものとみなします
が、数式計算のなごりですのでその点ご承知おきください。
15
符号
+
,
-
←右
-で数値の正負を反転します。+では変わりませんが演算子の+や++と区別しにくくかえってわかりずらくなりますので+はつけない方がいいでしょう。
16
累乗
**
←右
左辺値を右辺値で累乗した結果を返します。
結合性は右結合
(すなわち2**2**3は2**(2**3)で、64ではなく256)で、さらに符号より優先順位が高く-1**2は1ではなく-1です(数学記法に合わせたものです)。またこの演算子は言語によってかなり優先順位がちがうのでその点にもお気をつけください。関数pow()を使うのが確かかもしれません。
14
キャスト
(型変換)
(int)
,
(float)
(complex)
,
(real)
,
(image)
,
(img)
,
(arg)
,
(string)
,
(str)
←右
データの型を変換します。右辺値は数値もしくは純粋に数値を表す文字列です。文字列を数値に変換する場合に限りうまく変換できないときはエラー停止や途中までの変換でOKとはせず常数errorを返します。CALCには複素数に関する変換があり、(complex):複素数、(real):実数部取出((float)と同じ)、(image),(img):虚数部取出、(arg):複素角です。0の複素角は定義されずエラーになります。(image)と(img)、(string)と(str)は同じです。
17
否定
!
←右
右辺値が数値の0、空文字列""、論理値のfalse、null、未定義変数などの偽の値の場合trueを返し、それ以外falseを返します。
前置増減
++
,
--
←右
"++"で変数に1を加算、"--"で1を減算し、その結果の値を評価値とします。演算対象は変数でその内容は数値でなくてはなりません。
ビット反転
~
←右
ビットを反転した値を返します。右辺値は整数でなくてはなりません。
コピー
new
copy
←右
右辺の配列や関数の内容をそっくりコピーしたものを新しく作成します。配列は中に配列への参照があった場合も参照から値に展開されてコピーされます。関数はその内部変数もそっくりコピーされます。関数をコピーするのは主に関数を構造体などの代わりに使う場合です。
コピーされる内容は実行時点での内容で、定義された時点のものではありません
。主に 変数 = new 配列または関数;、変数 = copy 配列または関数; などの代入形式で使い、単独だとメモリーを浪費するだけであまり意味はありません。"new"と"copy"はまったく同じです。状況に応じて意味のわかりやすい方をお使いください。現在動作対象は配列と関数のみで、それ以外の場合は単に右辺の値が返されます。
18
後置増減
++
,
--
左→
変数の値を評価後"++"で変数に1を加算、"--"で1を減算します。演算対象は変数でその内容は数値でなくてはなりません。
関数実行
()
左→
()内の引数で関数を実行します。
メンバーアクセス
[]
,
.
左→
配列やユーザ関数の中のいわゆるメンバーにアクセスします。主に"[]"は配列、"."は関数内のメンバーにアクセスするのに使います。また文字列からの1文字取り出しには"[]"が使えます("."は使えません)。左辺値は配列名や関数名で、"."の右辺値はメンバー名(単に名前)とみなされますが、"[]"の中は値もしくは変数でもかまいません。メンバー名に名前文字以外(記号等)を含む場合は""か''で囲ってください。
19
カッコ
()
なし
一般的な用法として式の優先順位を変更します。それに加えCALCでは
文を式化して文の値(最後の文の実行結果)を値として取り出します
。これにより式の位置にも文を書くことができます。
◆ 関数 ◆
以下の数学関数が使えます。引数と返り値は、int:整数型実数、float:実数(浮動小数点数または整数)、complex:複素数または実数です。
float
abs
(complex)
絶対値。
float
abs2
(complex)
絶対値の2乗。実はこちらが元でabs()はabs2()の平方根。
complex
sqrt
(complex)
平方根。
complex
sin
(complex)
三角関数 正弦、サイン。三角関数の角度の単位はラジアンです。難しいので詳細省略。(以下同様)
complex
cos
(complex)
三角関数 余弦、コサイン。
complex
tan
(complex)
三角関数 正接、タンジェント。
complex
asin
(complex)
逆三角関数 逆正弦、アークサイン。
complex
acos
(complex)
逆三角関数 逆余弦、アークコサイン。
complex
atan
(complex)
逆三角関数 逆正接、アークタンジェント。
float
sind
(float)
float
cosd
(float)
float
tand
(float)
float
asind
(float)
float
acosd
(float)
float
atand
(float)
上記6つの三角関数で角度の単位は度です。引数の数値は実数でなくてはなりません。
complex
sinh
(complex)
双曲線関数 双曲線正弦、ハイパボリックサイン。
complex
cosh
(complex)
双曲線関数 双曲線余弦、ハイパボリックコサイン。
complex
tanh
(complex)
双曲線関数 双曲線正接、ハイパボリックタンジェント。
complex
log
(complex)
自然対数。
complex
log10
(complex)
10を底とする対数。
complex
exp
(complex)
自然対数の底(e)を底とする指数関数。
complex
exp10
(complex)
10を底とする指数関数。
complex
pow
(complex, complex)
累乗。第一引数を第二引数で累乗します。演算子**と同じ結果を返します。
float
real
(complex)
複素数の実数部。
float
image
(complex)
複素数の虚数部。
float
arg
(complex)
複素数の複素角。単位はラジアン。
float
factorial
(int)
階乗。nの階乗(数学記号n!)はn*(n-1)*(n-2)*...*1。引数は0以上170以下の整数。返り値は整数または実数。
float
min
(float,...)
最小値。引数は1個以上何個でも。実数のみ。複素数にはなぜか使えません。
float
max
(float,...)
最大値。同上。
float
random
()
乱数。0.0から1.0までの間の乱数を返します。引数はありません。
int
ceil
(float)
切り上げ。小数点以下を切り上げます。実数のみ。
int
round
(float)
四捨五入。小数点以下を四捨五入して切り捨てまたは切り上げします。実数のみ。
int
floor
(float)
切り下げ。小数点以下を切り捨てます。実数のみ。
その他に以下の組込み関数が使えます。引数と返り値は、int:整数型実数、float:実数(浮動小数点数または整数)、complex:複素数または実数、str:文字列、bool:論理値、x:文字列あるいは数値、void:無効な値、mix:その他各種 です。
int
parseInt
(x[, n])
基本的には文字列を整数に変換します。nが与えられればn進法での表記と解釈して変換します。演算子の(int)とは少し違い、変換できるところまで変換してあとは無視します。全く変換できないときはNaNを返します。第一引数は数値でもいいようですが、第一引数を文字列で与えた場合と数値で与えた場合とで結果が異なります(parseInt("5.5e-2")は5、parseInt(5.5e-2)は0になります)。処理はjavascriptのparseInt()をそのまま呼んでいます。
float
parseFloat
(x)
基本的には文字列を実数に変換します。演算子の(float)とは少し違い、変換できるところまで変換してあとは無視します。全く変換できないときはNaNを返します。処理はjavascriptのparseFloat()をそのまま呼んでいます。
str
date
()
現在の日時(ローカル表示)を文字列で返します。
int
time
()
現在の内部の時計の値を返します。返り値は整数でミリ秒の単位です。
int
arylen
(array)
int
isarray
(mix)
arylen()は配列の要素数を返します。
空の配列では0を返します。
また配列の中の配列はその要素数にかかわらず(空でも)1と数えます。引数が配列でないならエラーになります。
isarray()は引数が配列か否かの判定をし、配列でないなら−1を、配列ならarylen()と同様にその要素数を返します。判定と要素数の取得をいっぺんにやってしまおうという魂胆です。どちらも文字列も配列とみなしますがなるべく文字列にはstrlen()を使いましょう。絵文字の入った文字列の長さは保証できません。
int
strlen
(str)
引数の文字列の長さを返します。ただし絵文字の入った文字列の長さは保証できません。
int
strpos
(str, str[, pos])
第一引数の文字列の中に含まれる第二引数の文字列の位置を返します。位置posが指定されればそこから検索を開始します。最初に見つかった位置を返しますが見つからなければ-1を返します。文字列先頭の位置が0です。
str
substr
(str, pos[, len])
第一引数の文字列のpos位置からlenの長さの文字列を取り出します。文字列先頭の位置が0でposが負の場合位置は後ろから数えます。lenが指定されないか残りの長さを越えていれば最後までです。
str
trim
(str)
引数の文字列の前後の空白文字を取り除いた文字列を返します。空白文字にはスペースのほかにタブや改行なども含まれますが、javascriptのtrim()をそのまま呼んでおり全角スペースの扱いなどはブラウザによって違いが出ることがあります。
bool
isalpha
(str)
引数の文字(文字列なら最初の1文字)が半角アルファベットの場合trueを、そうでなければfalseを返します。
bool
isdigit
(str)
引数の文字(文字列なら最初の1文字)が半角数字文字(0-9)の場合trueを、そうでなければfalseを返します。
bool
isspace
(str)
引数の文字(文字列なら最初の1文字)が半角の空白文字(" ", "\n", "\r", "\t")の場合trueを、そうでなければfalseを返します。
void
clear
()
コンソール画面を消去します。引数と返り値はありません。
void
print
(x1, x2,...)
void
println
(x1, x2,...)
str
sprint
(x1, x2,...)
str
sprintln
(x1, x2,...)
print(),println()はコンソール画面に引数の内容を出力します。引数は文字列または数値で、0個(実質出力なし)から複数個あればそれらを順次出力します。println()は最後に改行します。途中改行するには"\n"を書きます。返り値はありません。
もし内部にHTMLタグを含めるときは終了タグまで一回で(一個のprint()で)書き出してください
。そうしないとブラウザが勝手に終了タグを追加しておかしな表示になることがあります。
sprint(),sprintln()は出力するかわりにその文字列を返します。
str
input
("msg"[, ans])
str
secretinput
("msg"[, ans])
str
answer
()
input
()はコンソールに入力メッセージ(msg)を表示し、ユーザからの入力文字列を受け取り返り値として返します。結果を受け取る変数ansが指定されていればそれにも代入されます。ansは他の名前でもかまいませんしなくてもかまいません。またansに値(数値または文字列)が設定されていれば入力欄にそれが事前挿入されます。値を事前挿入するだけならansは変数でなく数値や文字列でもかまいません。
受け取るデータは文字列ですので数値が必要なら(float)などのキャスト演算子で数値に変換するか、calc(input("msg"))として式の評価をして使ってください。キャスト演算子やcalc()は共に変換に失敗するとerrorを返しますのでそのチェックもお忘れなく。[Enter]キーまたは「入力」ボタンで入力完了、[↑][↓]キーで入力履歴を呼び出せます。
secretinput
()はinputとほぼ同等ですが入力欄を表示しません。完全にプログラム中からputinput()等で値を入力するのに使用します。"msg"は書式の互換上必要なだけで空("")でかまいません(あっても表示されないので)。
answer
()は直前のinput()の返答を返り値として返します。引数はありません。他の関数で結果をローカル変数に受け取った場合でも取得できます。
str
getinput
()
str
setinput
("str")
str
putinput
("str")
割込動作でプログラム中からinput入力を操作するための関数です。
getinput
()は現在入力欄(input)に入力されている値を取得します。
setinput
()は入力欄(input)にプログラム中から値"str"を入力し表示します。ディフォルト値などをあらかじめ入力しておく等に便利です。もし"str"中に改行"\n"があればそこでインプットは完了します。
putinput
()はインプット入力に"str"を設定し入力を完了させます("str"途中に改行"\n"があったらそこで完了します)。
使い方は、input()のあとに書いても入力待ちになってしまいこれらの関数は実行されませんので、
事前に<tag onclick="putinput(...)">とするとか、screenmouseclick()、settimer()などを使って割込を設定しておく必要があります
。いずれも設定または取得した文字列を返します。
void
wait
(ms)
時間待ちします。時間は
ミリ秒
で0から10000(10秒)までですが0では動作はしません。0以外では実際は動作のオーバーヘッドやタイミングロス分(1~数ms程度)が加算されるため時間はさほど正確ではありません。SVGグラフィックの図形の移動や書き換え等のスピード調整などに使用できます。返り値はありません。
void
sleep
(s)
一眠りします。時間は
秒
で0から100(100秒)までです。時間単位がちがうのみで実質wait()と同じです。返り値はありません。
obj
settimer
("command", time)
void
cleartimer
(obj)
settimer()はタイマーで指定時間(time:単位ms)後にCALCの式または文"command"を実行します。"command"は文字列で指定します。タイマーのIDを返しそのIDを使ってcleartimer(ID)で実行前の指定を解除できます。cleartimer()の引数が空なら設定されているすべてのタイマーを解除します。なおこのタイマー動作は割込で処理されますが割込処理中はブラウザとのやりとりは行われません。そのため一部の関数(input()等)は使えず(エラーになります)、画面書き換え等も割込処理が終了してからの動作となります。いったんsettimer()しますとCALCが正常終了したあとも有効になっていますので必要なければ終了時に解除してください。「リセット」ボタンと「実行」ボタンを押したときは自動的に解除されます。
obj
setinterval
("command", time)
void
clearinterval
([obj])
setinterval()はタイマーで指定時間(time:単位ms)ごとににCALCの式または文"command"を繰り返し実行します。"command"は文字列で指定します。インターバルタイマーのIDを返しそのIDを使ってclearinterval(ID)で実行を解除できます。clearinterval()の引数が空なら設定されているすべてのインターバルタイマーを解除します。なおこのインターバルタイマー動作は割込で処理されますが割込処理中はブラウザとのやりとりは行われません。そのため一部の関数(input()等)は使えず(エラーになります)、画面書き換え等も割込処理が終了してからの動作となります。いったんsetinterval()しますとCALCが正常終了したあとも有効になっていますので必要なければ終了時に解除してください。「リセット」ボタンと「実行」ボタンを押したときは自動的に解除されます。
mix
setcookie
("name", value[, life])
mix
getcookie
("name")
ブラウザにcookieを書込、あるいは読み出しします。"name"はcookie名で文字列1文字以上、valueは値で文字列です(数値でもかまいませんが文字列に変換されます)。lifeは有効期間で0か無指定ならブラウザ終了まで、数値なら秒、あとは文字列で"1day"などと指定できます。指定できる時間単位は"sec", "min", "hour", "day", "week", "month", "year" です。消去するにはlifeに-1を指定します。どちらも読み出した値(文字列です)を返しますがcookieがない場合や無効の場合はfalseを返します(空文字との区別のため)。数値を保存しても読み出し値は文字列になりますのでお気をつけください。
mix
calc
("str"[, errmsg])
引数の文字列をCALCの式や構文としてCALCの処理系で評価します。返り値は評価結果の値ですが、
エラーが起こった場合でもエラー停止はせずに常数errorを返します
。またerrmsgに真の値が設定されていればエラーが起こった場合その内容を画面に出力します。
また同名の関数がjavascriptにも登録してあり、タグ内の onclick="calc('...');" などからcalc内の変数を変えたりすることもできます。こちらは割込で優先処理されます。
str
longcalc
("siki")
str
longmode
("mode")
str
longseido
("keta")
str
longseidocut
("cut")
str
longadd
("n1", "n2")
str
longsub
("n1", "n2")
str
longmul
("n1", "n2")
str
longdiv
("n1", "n2")
str
longmod
("n1", "n2")
str
longpow
("n1", "n2")
str
longfact
("n")
str
longroot
(["n1", ]"n2")
str
longtoE
("n"[, "keta"[, "cut"]])
高精度文字列計算関係の関数です。
引数および返り値はすべて文字列です。
longcalc
()は引数の文字列で表された式を計算し結果を数字文字列で返します。数値文字列は整数、小数点表記実数、指数表記実数(1.234E5など)のいずれでもかまいません。エラーが起こった場合はエラー内容を表示し定数errorを返します。
可能な演算は(1)加算減算"+,-", (2)乗算除算剰余算"*,/,%", (3)符号"+,-"("+"はなくてよい), (4)累乗"**"(累乗数は0か正の数で小数部はあっても1桁か2桁), (5)階乗"!"(0か正の整数に対して一重のみ、!!はエラー), (6)優先括弧の"()"、及び(7)関数root()(rootはlongrootの組込名)です。優先順位は(1)->(7)の順に高くなります。
longmode
()は計算・表示モードを設定します。"mode"が"."ならば整数.小数モード、"E"または"e"なら指数モードです。指数モードでも指数が0の場合のE0はつきません(0だから)。整数.小数モードの方が概ね計算は速いです。
longseido
()は以下の計算での計算精度として有効桁数を指定します。整数.小数モードでは精度は小数部のみに適用され整数部の桁数は無制限です(もともと長整数の計算から出発したのでその互換のため)。指定精度以下の値は
評価や計算の都度
longseidocut()で指定された方法で丸められますので誤差の累積により最後の1,2桁が少し狂うことがあります。精度のディフォルトは24です。引数がなければ現在の値を文字列で返します。
longseidocut
()は指定精度での丸めの方法を指定します。引数は"ceil"(切上げ),"round"(四捨五入),"floor"(切捨て),あるいは切り捨てる上限の数字("0"~"9")です。ディフォルトは"4"(四捨五入)です。
その他
longadd
()から
longfact
()は各々の演算の個別関数で引数は数字文字列、返り値は結果の数字文字列です。
longroot
("n1","n2")は"n2"の"n1"乗根を求めます。平方根の場合のみ第一引数を省略して
longroot
("n2")でもかまいません。
longtoE
()は数字文字列"n"を有効数字"keta"(指定されなければ100)、"cut"で指定された丸めの方法("ceil","round","floor"など、指定されなければ"round")で指数表記(1.234E+5などの形)に変換します。有効数字の指定は整数部含めて適用されます。
計算する数字の桁数(結果も含めて)、精度(有効数字)共にあまり大きいと、特に計算負荷の高い累乗、階乗、root()などの演算でタイムオーバーすることがありますのでご注意。
mix
jseval
("str")
引数の
文字列
をjavascriptの式や構文としてjavascriptの処理系で評価し、結果を数値,文字列,論理値,配列のいずれかで返します。内部ではjavascriptのeval()関数を文字列引数で呼出し、返り値は数値,文字列,論理値,配列のいずれかでなければ文字列に変換します(javascriptのわけのわからないObjectなどを返されても困るからです)。CALCに用意されていない文字列処理、配列処理、あるいは正規表現処理などを実行するのに使えます。CALCを動かすスクリプトレベルでの処理なので名前がかぶったり文法ミスがあったりすると何が起こるかわからず、エラーならまだしも固まって操作不能になることも起こりえますので気をつけてお使いください。
bool
delete
(var[, var ...])
与えられた引数の変数,配列,関数などを消去します。配列,関数の場合はその内部要素もそっくり消去されます。ユーザ定義の変数,配列,関数はもとより
組込の常数や関数も消去できます(虚数単位i,jは特殊な数値であり変数ではないので消去はできません)
…意識的に組込の常数や関数を書き換えたいときのために一切チェックはしないということです。いったん消去したら再定義するまでの間その名前の変数や関数は使えません。離して記述するとわかりにくくなりますので、できるだけ再定義と対でお使いください。
メモリーの開放についてはjavascriptのガーベージコレクションで行われますので実際のメモリー開放とは必ずしもイコールではありませんし、特別大量のメモリーを喰っていない限りdeleteの必要はありません。すべての変数の削除に成功したらtrue,それ以外(変数がないか変数があって削除に失敗したとき)falseを返します。引数がないか変数でない引数(数字や文字列など)を与えたときはエラーになります。いったん消去した変数や関数を元に復活する関数はありません(退避用の変数に保存しておいて戻せばできますが)。
bool
usestrict
(mix)
プログラムチェック用に多少厳密なチェックを有効あるいは無効にします。引数はtrue/false(または1/0)で真の値なら有効、偽の値なら無効となります。有効に設定された場合true、無効に設定された場合falseを返します。
厳密チェックモードを有効にすると次のような場合エラーになります。多少プログラミングは窮屈になりますがバグの発生は抑えられます。
●変数が宣言されずに、あるいは宣言前に使用された。●同じ名前の関数または変数が競合して多重に宣言された(但し宣言がif-elseなどの条件文の中だと必ずしもうまく動作しない場合があります)。●実行関数の引数(仮引数)と同じ名前の変数が関数内で宣言された。●関数に期待されない引数が渡された(例:isalpha()に文字か文字列以外を渡した場合など)。
●ユーザ関数への引数が省略されて呼び出された(引数省略機能を使った)。
検出や動作は必ずしも完璧ではありません。あくまで参考にプログラミングの補助機能としてプログラム作成時だけにお使いください。関数calc()の中では効きません(変数を使うのにいちいちvar宣言とかめんどうなので)。
◆ グラフィック ◆
ほんのおまけでごく簡単なグラフィックを描くこともできます。グラフィックはSVGとcanvasが両方同時に使えます。ただし大量のSVGグラフィックを描くとだんだんグラフィック処理が重くなって遅くなり最後にはブラウザが固まるかこけますのでSVGグラフィックの要素の数(SVG描画関数の呼出回数)は数千が限度でしょう。canvasにはこの制限はありません。細かい点を多数操作するならcanvasをお使いください。
以下の説明は基本的にSVGでの説明で
canvasではタグidは返さずidでの書き換えはできません
。
その他SVGとcanvasでは微妙なちがいが出ることがあります。どちらを使うかは実際に試して決めてください。
以下、グラフィック関係の関数で
頭に"c_"がついているものはcanvasの描画関数
でそれ以外はSVGの描画関数です。色などの描画パラメータはcanvasとSVGとで共通です。寸法の単位はすべてpx(ピクセル)です。
描いたグラフィックはCONSOLE右上の「画像保存」ボタンで画像として保存できますが、ブラウザによってはtextの文字や空白が表示と異なる場合があります。インターネットエクスプローラ11(Trident/7)ではSVG部分は保存されず、またインターネットエクスプローラ10以下ではグラフィックそのものが使えません。その他ブラウザによる違いなどがあり実際にやって確認してください。
グラフィック[SVG保存]ボタンでSVGデータの保存ができますがHTML5ブラウザ向けですのでブラウザ以外の画像ソフトでの表示には多少修正が必要かもしれません。
スクリーンあるいはSVG描画タグは描画条件を変えたり描画内容を変えることができ、その指定はsid.screen(...)やtid.text(...)といったid.fnc()形式で行います。sidやtidは関数が返すスクリーンタグや描画タグのオブジェクト識別idです(実態は単なる整数ですが)。なおいったん投入したグラフィック関係のタグの削除はできません。消したり無効にしたい場合は色を透明にしたり表示範囲外に移動するなどして対応してください。
グラフィック関係の関数では一部の関数(screen(),pendash())を除きユーザ関数と同様に引数の省略機能が動作します。すなわちいったん与えた引数は次回以降省略すると同じ値が使われ同じことを毎回記述せずにすみます。
int
consolewidth
()
コンソール画面の幅を取得します。いちおうスクロールバーや余白の余裕を見た値です(ブラウザによって少し異なります)。コンソール画面のサイズに合わせてグラフィックしたいときに使います。引数はありません。
int
consoleheight
()
コンソール画面の高さを取得します。いちおうスクロールバーや余白の余裕を見た値です(ブラウザによって少し異なります)。コンソール画面のサイズに合わせてグラフィックしたいときに使います。引数はありません。
int [sid.]
mpx
()
int [sid.]
mpy
()
マウスがスクリーン上にあるとして各々そのx座標、y座標を返します(いちいちスクリーン内かどうかまでは調べません)。sidはスクリーンidで、省略された場合はマウスの乗っている(重なっている場合は一番上の)スクリーンです。
sid [sid.]
screenstyle
("style")
SVGとcanvasに共通です。グラフィック画面の外観をCSSスタイルを使って設定または変更します。
newscreen()やscreen()で設定する内部の描画用パラメータとは別です。
引数のstyleはCSSスタイル形式で指定します。初期値は""(空)でこれでよければ特に実行する必要はありません。枠をつけるならscreenstyle("border:2px solid silver;");などとします。sidはスクリーンのid番号ですが、
指定されなければこれからnewscreen()で作成されるスクリーンすべてに、指定されれば(すでにある)その番号のスクリーンにのみ適用します。不要な書き直しを避けるために基本的にはスクリーン作成前に指定してください。
適用したスクリーンのidを返します。
...参考までによく使いそうな"style"設定を例としてあげておきます。スタイルなし:""、背景色:"background:#def;"、枠:"border:2px solid silver;"、幅:"width:400px;"、高さ:"height:300px;"、左マージン:"margin-left:50px;"、上マージン:"margin-top:10px;"、右マージン:"margin-right:8px;"、下マージン"margin-bottom:8px;"、非表示:"visivirity:hidden;"、表示:"visibility:visible;"、はみだし部分も表示する:"overflow:visible;" など。
sid
newscreen
(w,h,zw,zh,dx,dy,so)
SVGとcanvasに共通です。新しいグラフィック画面(領域)を準備し描画対象スクリーンに設定します。引数は、w,h:描画領域の幅,高さ(int)、zw,zh:描画内容の拡大縮小率(float)、dx,dy:描画内容の位置補正(int)、so:canvasとSVGの重ね順で"cs"ならcanvasの上にSVG、"sc"ならSVGの上にcanvasです。
"sc"は重ね合わせた画像の保存がうまくできず、canvasかSVGのいずれか一方しか保存できません。
初期値は w=400, h=300, zw=1.0, zh=1.0, dx=0, dy=0, so="cs" で、以上は与えられた引数の値のみ前の値から変更されます(引数省略機能が動作します)。描画領域外にはみ出た部分は表示されません。作成されたスクリーンのidを返します。作成するスクリーンのidの指定はできません(自動的に1から順番になります)。
sid [sid.]
screen
(w,h,zw,zh,dx,dy,so)
SVGとcanvasに共通です。スクリーンパラメータを変更しそれを使って内容を書き換えますが描画対象スクリーンは変更されません。スクリーンidを指定しない場合現在の描画スクリーンを対象としますがまだスクリーンがなければ特別サービスで新しく作成します。引数はnewscreen()と同じですが、
与えた引数のパラメータのみ変更(再設定)されます(引数省略機能は動作しません)
。すでにあるSVG画像は新しいパラメータで書き直されますが
canvas画像は書き直されません
。変化させる画像とさせない画像の使い分けには利用できます。SVGは画像データによっては書き直しに時間がかかります。変更を適用したスクリーンのidを返します。
sid [sid.]
screenselect
()
SVGとcanvasに共通です。引数はありません。スクリーンidの指定があればそのスクリーンを描画対象スクリーンに変更します。id指定がなければそのまま描画対象スクリーンのidを返しますが、まだスクリーンがなければ0が返されるのでスクリーンの有無の判定もできます。
sid [sid.]
screencopy
()
SVGとcanvasに共通です。引数 はありません。グラフィックスクリーンをコピー表示します。すなわち同じ画像が表示されます。描画対象スクリーンは変更されません。作ったアイコン画像を並べたいときなどにお使いください。sidはnewscreen()で返されたコピー元のスクリーンidで、指定されなければ現在有効なスクリーンです。返り値は新しくコピーして作ったスクリーンのidでidの指定はできません。
sid [sid.]
screenmouseall
('siki')
sid [sid.]
screenmouseover
('siki')
sid [sid.]
screenmouseout
('siki')
sid [sid.]
screenmousemove
('siki')
sid [sid.]
screenmousedown
('siki')
sid [sid.]
screenmouseup
('siki')
sid [sid.]
screenmouseclick
('siki')
SVGとcanvasに共通です。グラフィックスクリーン上でのマウスイベントの処理を指定します。mouseallはすべてのマウスイベントにまとめて設定します。常に同じカーソル表示をする場合などいちいち個別に設定しなくてすみます。 'siki'は
式を文字列として記載しCALCの式として評価されます。解除するなら''(空文字)またはnullを設定します。文字列を返すとマウスがスクリーン内にあるときカーソル位置に表示されます。
なお上記設定によらずグラフィック番号("Graphic1"とか)は常に表示されます(画像保存の番号選択のため)。sidはスクリーンidですが省略されると現在の描画スクリーンに対して設定します。設定したスクリーンのidを返します。なおこの動作は割込で処理されますが割込処理中はブラウザとのやりとりは行われません。そのため一部の関数(input()等)は使えず(エラーになります)、画面書き換え等も割込処理が終了してからの動作となります。
同じスクリーンに複数のイベントを設定した場合ブラウザによってイベントの発生の有無や順序が異なり(特にclick,down,up)なかなか思い通りにならなかったり、またマウスの動きが速いと(特にmoveで)追従や動作しない場合があります。
スクリーン画面をダブルクリックするとマウス座標を表示して10秒間その値を記憶し、その間にプログラムの座標を記入したいところをクリックすればそこに座標が"X,Y"の形で挿入されます。描画関数の引数に位置の値を入れるのに使用します。慣れると描画タグのコピーペーストと組み合わせて楽にタグを書き込めます。10秒以内にスクリーン画面で再度ダブルクリックすると表示と記憶は消されます。座標が記憶されている間はダブルクリックしたマウスカーソルの位置にその旨表示されているので判別が可能です。XとYはスクリーン内部の描画座標、(x,y)は画面上の見かけのピクセル数で、挿入されるのは描画座標のほうです。スクリーンへの拡大縮小や位置補正がかかっていなければこれらは同じで描画座標のみ表示されます。描画タグへの位置補正zoom,rotate,shiftが有効の場合値がずれますのでご注意ください。
以下グラフィック描画パラメータの設定関数です。
SVGとCANVASに共通
で
現在選択されているスクリーンに対し設定
します。
void
pen
(w,"lc","lj")
図形を描く筆を準備します。wは太さ(float)で初期値は1.0、1以下を指定すると色が薄くなりそれらしくみえます。lcは筆先の形状で文字列"butt","round","square"のいずれか(初期値は"butt")、ljは接続部の形状で"miter","round","bevel"のいずれか(初期値は"miter")です。詳しくはSVGのstroke-linecap,stroke-linejoinを検索参照してください。与えられた引数の値のみセット(変更)されます。
void
pendash
([l1,l2,...])
破線を描く設定をします。引数は描画する線の長さ,描画しない線の長さを交互に指定します。
与えた引数のみでセットされます(引数省略機能は動作しません)
。引数が1個か与えられなければ普通の直線にリセットされます。一部のブラウザのcanvasではうまく動作しません。
void
color
("c1","c2",o1,o2)
描画色および色の不透明度を設定します。c1,c2は色を表す文字列で、c1は主色(主に図形の外形、線の色、文字の色)、c2は副色(図形内部や文字の縁取り等)の色です。o1,o2は数値(float)で0.0~1.0の値、o1は主色の不透明度(0:透明,1:不透明)、o2は副色の不透明度です。不透明度は色の方にagba()を使って設定してもかまいませんが両方混ぜて使うと競合して思い通りになりませんのでどちらか一方だけにしておくのがいいです。色の表現は"transparent"(透明)のほか、"white","red","blue"などの色名称(WEB標準色)、3原色16進指定"#000"(黒)~"#FFF"(白)、"#000000"(黒)~"#FFFFFF"(白)、"rgb()"、"rgba()"などが可能です。空文字("")は透明になります。与えられた引数の値のみセット(変更)されます。初期値はc1が黒("black")、c2が透明("transparent")、o1,o2は共に1.0(不透明)ですが副色c2の初期値は色が設定されていないので実際には透明になります(色を指定したとき効果を発揮します)。
void
font
("style","weight","family")
テキストを書くのに使用するフォントのスタイル、太さ、種類を設定します。styleは"normal"(標準体),"italic"(イタリック体),"oblique"(斜体...日本語フォントでは概ねitalicと同じ),"small-caps"(英小文字を小さな大文字で表示しますが無視される場合が多いです)で複数なら間を空白で区切ります。weightは"normal"(標準)、"bold"(太字)または"100"~"900"の太さを表す数字です。familyは書体(フォント)名ですが"monospace","sans-serif","serif","cursive","fantasy"等一般的なフォント指定で指定しておくのが安全そうです(なければPCやブラウザのディフォルトのフォントになるけどむしろもくろみからは遠いかもしれない)。ディフォルトは"normal","normal","monospace"です。与えられた引数の値のみ変更されます。返り値はありません。
void
anchor
(x,y)
void
scale
(zx,zy,zp)
void
zoom
(zx,zy,zp)
void
rotate
(angle)
void
turn
(angle)
void
rotated
(angle)
void
turnd
(angle)
void
translate
(x,y)
void
shift
(x,y)
今後の描画時の描画位置などの補正をします。すでに描いてしまった図形には影響しません。またスクリーンそのものに設定する表示時の拡大縮小や位置の移動とは別です。
anchorはscale,zoom、およびrotate,turnの基準点を設定します。ディフォルト値はどちらも0です。
scale,zoomは拡大縮小で、縮尺は横方向zxと縦方向zyの位置や寸法、縮尺で線が細くあるいは太くなりすぎて見にくくなったときの線幅補正zp(縦横はなし、縮尺された線幅に対して)を指定できます。ディフォルト値はすべて1.0(等倍)です。scaleとzoomは同じです。
rotate,turnは回転で角度の単位はラジアン、時計回りが正の値です。rotated,turndは角度の単位は度(degree)です。ディフォルト値は0(回転なし)です。rotateとturnは同じです。
translate,shiftは横及び縦方向の平行移動で単位はピクセルです。ディフォルト値はどちらも0(移動なし)です。translateとshiftは同じです。translate,shiftは元の座標系で行われ、scale及びrotateの影響は受けません(そうしておかないと計算がめんどうでわけがわからなくなった)。
処理はscale->rotate->translateの順に行われます。いったん設定するとずっと有効になるので必要な処理が終わったら戻してください。save()とrestore()を使えばいちいち値を指定せず戻せます。
斜めの図形を描いたり、すでに書いてしまったコードで一部大きさや位置を変更・修正したり、またSVGではこれを使って図形を書き直すことにより動かしたりすることもできます。
int
save
([idnum])
int
store
([idnum])
int
restore
([idnum])
save()とstore()は上記pen()からrotate()までの関数で設定されたパラメータを保存し、restore()はそれを復元します。saveとstoreは同じです。引数がないなら自動でデータをpush/popしますのでsave()とrestore()は正しく対応していないといけません。正の整数が引数idnumとして指定されればその番号で保存/復元しますがこの場合は自動的なpush/popはしません。手動指定する場合の引数の番号は引数なしの自動採番(1から)とかぶらないようある程度大きな番号を指定するのが確かです。保存された、あるいは復元されたパラメータのid番号を返します。
以下グラフィックの描画関数です。現在選択されているスクリーンに対し描画します。
頭がc_のものはCANVAS用でCANVASスクリーンに描画し、それ以外はSVGスクリーンに描画します。
SVGでは描画タグのid(tid)を返し、tid.line(...)などの形で書き換えができます。tidは1からタグ作成順につけられます。tidは手動での指定もできますが自動のid番号と重ならないような充分大きな値(推奨90000以上)をお薦めします。手動idのタグは自動作成されませんのでタグの作成は tid=90001;tid.line(...); あるいは 90001.text(...); などの形になります。同じ描画関数をスクリーンをまたいで使用するなどでタグidを固定したい場合に手動指定を使用します。
なおいったんグラフィックに投入した描画タグの削除はできません。
tid [tid.]
line
(x1,y1,x2,y2)
void
c_line
(x1,y1,x2,y2)
直線を引きます。x1,y1,x2,y2は各々始点のx座標,y座標、終点のx座標,y座標です。SVGでは描いた図形タグのidを返し、idが指定されればそのidの図形を書き換えます。線の長さは小数でもかまいませんが短いと何も描かないブラウザがあり限界はよくわかりません。0.1くらいあればいいようです。
tid [tid.]
rect
(x,y,w,h,rx,ry)
void
c_rect
(x,y,w,h)
四角形を描きます。x,y,w,hは各々左上のx座標,y座標、四角形の幅,高さ、rx,ryは角の丸さ(SVGのみ)です。SVGでは描いた図形のidを返し、idが指定されればそのidの図形を書き換えます。
tid [tid.]
circle
(x,y,r)
void
c_circle
(x,y,r)
丸(円ともいう)を描きます。x,y,rは各々中心のx座標,y座標、半径です。SVGでは描いた図形のidを返し、idが指定されればそのidの図形を書き換えます。
tid [tid.]
ellipse
(x,y,rx,ry)
void
c_ellipse
(x,y,rx,ry)
楕円を描きます。x,y,rx,ryは各々中心のx座標,y座標、横半径、縦半径です。SVGでは描いた図形のidを返し、idが指定されればそのidの図形を書き換えます。
tid [tid.]
text
(x,y,"text","size","anc")
void
c_text
(x,y,"text","size","anc")
テキストを書きます。xはテキストanc位置のx座標,yはテキスト
ほぼ下
側(フォントのベースライン?)のy座標、textはテキストの内容、sizeは大きさ("14px","12pt","1em","150%"などです。数字だけならピクセルとみなされます)、ancは左右基準位置の指定("start","left":文字の左下、"middle","center":中央下、"end","right":右下)です。テキストには改行は含ませない方が確かです。また表示されるテキストの長さはなぜかSVGとcanvasで、あるいは表示環境によってかなりのちがいが出て尻切れになることがあるので充分余裕をとってください。SVGでは描いた図形のidを返し、idが指定されればそのidの図形を書き換えます。
tid [tid.]
point
(x,y,w,h)
void
c_point
(x,y,w,h)
座標x,yを中心に四角の点を打ちます。x,y,w,hは各々中心のx座標,y座標、幅、高さです。pen()の値は使いません。SVGでは描いた図形のidを返し、idが指定されればそのidの図形を書き換えます。
...ただしSVGで大量の点をうつとだんだんグラフィックデータが重くなり最後にはブラウザが固まるかこけます。数千ポイント程度を上限としてください。
大量に点を打つならcanvas関数c_point()をお使いください。
pid [pid.]
path
()
void
c_path
()
void
c_drawpath
()
path()は多角形、円弧、曲線など多彩な図形を描く手順(いわゆるパス)を設定します。svgでidが指定されなければ、あるいはcanvasでは新しいパスの開始を宣言しますがこの段階ではまだ何も描かれません。色や線の太さなどのパラメータはSVGではパス宣言時、canvasではc_drawpath()実行時に取り込まれ適用されます。
新しいパスの最初のコマンドはmoveto()でなくてはなりません
。SVGでは設定されたパスのidを返し、idが指定されればパスをそのidに切り替え
パラメータを取り込み直して再描画します
。一方canvasの場合(c_path())では(あれば)現行のパスを終了し新しいパスを設定しますが
既存のパスはc_drawpath()を実行しないと何も描画されません
のでお気をつけください。
描画はSVGの場合描画コマンドの都度自動的に行われますが
canvasではc_drawpath()で行われます
。canvasで都度描画しますと透明度を設定した場合上書きで効果が変わってきます(透明度を低く設定しておいて幾度も上書きしてじわっと表示するのには使えますが)。
以下はパスへの描画コマンドですが、いったんパスに投入された個々の描画コマンドの削除や変更はできません。
pid [pid.]
moveto
(x,y)
void
c_moveto
(x,y)
パスの始点として座標x,yを設定します。ペンをそこに持っていくイメージです。
path(),c_path()を宣言したら最初に実行する必要があります。
また描画コマンドの間でもかまいません。SVGでは設定したパスのidを返し、idにpath()で返されたid番号を指定するとそのパスに新しい始点の座標を設定します。
pid [pid.]
lineto
(x,y)
void
c_lineto
(x,y)
パスの始点から座標x,yに直線を引きx,yを新しい始点に設定します。多角形を描くときはlineto()を必要回数続けて最後にclosepath()します。SVGでは描画したパスのidを返し、idにpath()で返されたid番号を指定するとそのパスに描画します。
pid [pid.]
ellipseto
(x,y,rx,ry,ro,sf)
楕円弧を描きますが話が難しいです。パスの始点から座標x,yを終点とし、x軸半径rx、y軸半径ryで、角度ro
(単位は度)
だけ回転した楕円の楕円弧を描きますが、そのような楕円は2つ考えられ、さらに始点から終点まで4つの弧が想定されます(左図参照、交点が始点終点)。だからsfの値0~3でその弧を選びます。半径の指定が小さく指定点を通らないなら半径は自動的に拡大されます。...真円ならともかく傾いた楕円ともなるとパラメータが直感的に設定しにくいのが難です。描画後x,yを新しい始点に設定します。idにpath()で返されたidを指定するとそのパスに描画します。描画したパスのidを返します。
void
c_arc
(cx,cy,r,sa,ea,cc)
円弧を描きます。点(cx,cy)を中心として半径rの円または円弧を描きます。sa,eaは開始終了の円弧の角度で0から2*PI。ccは円弧を描く方向でtrueなら反時計回りになります。線は開始点から円弧のsaにあたる点に引かれ円弧が描かれ円弧の終了点が次のパスの開始点になります。値は返しません。
void
c_arcto
(x1,y1,x2,y2,r)
円弧を描きますがこちらも話が難しいです。始点(x0,y0)からx1,y1への直線とx1,y1からx2,y2への直線に接する半径rの円を考え、始点から円との接点までの直線、その接点からもう一つの直線との接点まで円弧を描きます。canvasの場合は円で楕円にはなりません。値は返しません。
pid [pid.]
curveto
(x,y,df)
void
c_curveto
(x,y,df)
前回のパスを参考にしてパスの始点から座標x,yに曲線を引きx,yを新しい始点に設定します。少ない点でなめらかな曲線にしたいとき使用しますが、あまり細かい範囲で使用したり急に折れ曲がったりすると振動したりしてかえっておかしな描画になることがあります。引数dfはそれを抑えるためのダンパー係数で0.0~1.0を指定できます(ディフォルトは0.5、ダンパーなしが0.0、1.0だとフルダンパーで直線描画になります)。SVGではidにpath()で返されたid番号を指定するとそのパスに描画します。描画したパスのidを返します。
pid [pid.]
closepath
()
void
c_closepath
()
パスの最後の点からmoveto()で設定された最初の点へ直線を引き
図形を閉じます
。path()コマンドを閉じる(終了する)のではありません。多角形を描くときはlineto()を必要回数続けて最後にclosepath()します。SVGではidにpath()で返されたid番号を指定するとそのパスに描画します。描画したパスのidを返します。
str [sid.]
getsvgcode
(sn)
編集・チェック用の関数です。指定された、あるいは無指定なら現在有効なグラフィックスクリーンのSVGコード(タグを表示用に変換したもの)を返します。引数snで単なる整数でのスクリーン指定も受け付けます(sn優先、テストあるいはチェック用)。canvas部分は取り除かれます。printすればSVGグラフィックのコードが表示されます。printして表示されたコードをそのまま他のホームページにコピーペーストしてSVG画像を表示させることもできます。
void
showpoint
(r)
void
c_showpoint
(r)
編集・チェック用の関数です。r>=1なら描画タグの指定点に○(canvasでは□)印を表示します。rは○(□)の大きさ(半径または片側)です。パスのmoveto()は緑、lineto()は青、curveto()は赤、その他のパスは紫、パス以外のタグ(point,c_pointを除く)は茶色で表示されます。
◆ ユーザ定義関数 ◆
その他ユーザ定義関数が使えます。関数定義の書式は function fncname(a,b,...){ 式;...; } で()や{}は省略できません。関数の呼出(実行)は fncname(1,2,...) となります。基本的にはごく一般的な関数の使用法と同じですが、以下にいくつか注意事項を書いておきます。以下引数の()内と関数本体の{}内は省略します。
関数名
いわゆる予約語は使えません。またすでに定義されている常数名や組込関数名は使えません(先にdelete()で消去してしまえば可能ですが)。関数名に使える文字はアルファベット、数字、アンダスコア("_")ですが、頭はアルファベットか"_"で数字は除かれます。(以上変数名と同じです)。
関数の名前は必ずしもなくてもかまいません(いわゆる無名関数。内部的には動作上ひそかに名前をつけてはいますが)。 この場合名前でのアクセスはできませんので、(function(){})()としてその場で実行するか、f=function(){}; として変数に入れ、f()で実行するか、別の関数の返り値 function f1(){ ...; return function(){}; }として親関数を通して f1()() として実行するなどしなくてはならなくなります。
属性の付加
関数を書換禁止にするには const function f(){} とします。変数とちがいvar宣言しなおしての書換はできません。関数内からグローバル関数を作成するには global function f(){} とします。これらの関数の属性に関する構文はconst等の宣言の中で関数を定義するのではなく、関数定義のfunctionに属性を付加するものとして解釈され、属性の適用はその関数定義にのみ一回きりです。
定義位置
関数は通常トップレベルに記載しますが、関数内でに書いてもエラーにはなりません。関数内で定義した関数は通常その関数内でしか使えません(アクセス演算子"."を使えば外からでも可能)。
実は function の書かれた場所のチェックはしていませんので if-else 構文内や、その他の場所でも()で囲って式化してしまえば式の位置にでも書くことは可能かも...でもすべて確認したわけではありませんのでエラーにならずにちゃんと動作すればということで...。
関数の再定義
ユーザ関数を再定義してもエラーにはなりません(厳密チェック(strict)モードではエラーになります)。実行時function定義を通過した時点で関数の実行コードは書き変わりstatic以外の内部変数等は消去されます。特に関数内関数は親関数の実行の度に再定義されます。またglobal宣言で外部に作成した変数や関数はめんどう見ません。通常同じ関数名を使い回す必要はないと思われますし実際にどの関数が動いているのかわからずバグの原因になりやすいのでなるべく再定義はしないようにしましょう。組込関数の再定義はエラーにしています(先にdelete()で消去すれば可能です)。
引数
関数の引数は数値、論理値、文字列、配列等多くの型の使用が可能ですが、voidとundefinedは有効な引数としては認められません。
関数の引数の数は呼出側と実行側で合っているのが基本ですが、合っていない場合必ずしもエラーとはならず次のような動作となります。
・CALCの
ユーザ関数
と
ほとんどの組込グラフィック関数
はいったん与えられた引数を覚えこみます。これを利用して2回目以降省略ができ同じ記述を幾度もせずにすみます。
・関数定義の際引数変数に初期値を与えることもでき、たとえば function f(a,b=0,c=1){} などとするとbやcに呼出側で引数が与えらなければこの初期値が使われます。
・実行側の引数が少ない場合、呼出側の余った引数は単に無視されエラーにはなりません。
・呼出側の引数が少ない場合、関数定義で初期値を与えていなければ初回エラーになりますが、初回引数を与えて正常に実行した後ならば省略しても前の引数が使われエラーになりません。
・引数の省略は順番さえ守れば一部省略一部与えるというのも可能です。優先順位は与えた引数、関数に記述した初期値、いったん与えて記憶された値の順です。
・でもこの
引数省略機能
は必ずしも他の言語では使えませんのでご承知置きください(グラフィックの場合などとても便利だけど)。数学関数などではこの機能は動作せず引数の省略はできません。
・関数引数の()内のNameSpaceは呼出側ではその関数の位置(呼出側関数の外側)、実行関数側(function宣言された側)ではその関数の内部と同じになります。引数()の内部で変数や関数を使う場合にはお気を付けください。さらに実行側関数の仮引数の名前がすでにあるグローバル変数の名前とかぶった場合、うっかり気がつかないと誤動作のもととなりますので仮引数の名前設定にはお気をつけください。
・関数の今回呼出の引数(有効無効判定前)、および実際に使われ記憶された有効な引数は各々argc,argv[]およびargcm,argvm[]に入っていますので可変長引数関数なども書こうと思えば書けます。
関数の初期化
関数の初期化は、プログラム実行開始時のいわゆるプログラム初期化時、実行がfunction定義を通過したとき(関数再定義)、および関数を変数に代入したとき(代入した変数側で)行われます。初期化ではstatic変数を除く関数内変数等はいったん削除され次の関数実行時に変数宣言等が再実行されます。よってfunction定義を実行プログラムの途中に書くとそこで初期化が起こり内部変数が予期せず書き換わることがあるのと無駄な初期化が起こるので、関数定義はなるべく最後に書くのが無難です。関数fを強制的に初期化するにはf=f;とすれば(static変数を除き)初期化されます(変数代入時の初期化)。
関数の実行
通常は関数を function f1(){}で定義し、f1()で実行します。(function f1(){})()で定義してその場で実行することもできます。さらにはfunction f1(){}()でも実行します。(関数定義に直に続けて()を書いた場合。正しい書き方は(function f1(){})()なのですが。)。 その場で一回だけ実行すればいいなら関数名f1はなくてもかまいません。また下記のように変数に代入して実行することもできます。
変数への代入実行
function f1(){} で関数f1を作成しておいてf=f1;で関数f1を変数fに代入し、f()で関数を実行することは可能です。内部変数等は代入時に初期化され、以後代入した変数fの所有としてf1とfの内部変数は分離されます。内部変数までそっくりコピーするなら f = copy f1;とすればその時点の変数名と値がそっくりコピーされますが、やはり変数の所有は分離されます。
返り値
値を返すには return 式; を使います。return 式; の式、あるいはreturnそのものがない場合は値は返しません(正確に言うと無効な値voidを返します)。
◆ コメント ◆
/*と*/で囲まれた範囲、//から行末まで、および#から行末まではコメントとなります。コメント内部には日本語が使えます。/* */は完結していないとエラーになります。コメントのネストは書き方によってはエラーになりますのでしないほうがいいでしょう。単なる"文字列";のみの文も実質コメントと同じですが最後に書けば結果として表示されます。
◆ その他 ◆
セキュリティー上ハードウェアにからむ操作(メモリ操作、ファイル操作、I/O操作など)はできません。
エラー検知についてはよくありそうなエラーはできるだけ検知して表示するようにしていますが必ずしも完璧ではなく、エラー検知できずに誤動作したりおかしな値になることも可能性としてはなきにしもあらずですのでご承知おきください。