Kawari Inline Script Reference Manual

2005/07/03
Phase 8.2.3

華和梨開発チーム :
NAKAUE.T (Meister), 偽Meister (夢乃), さとー, 酔狂, さくらのにえ

Index

← back
1. Overview
2. Format
3. Evaluation, Return Value, Truth Judgment
4. Commands
 4.1. Command List
 4.2. Command Reference
  4.2.1. Syntax
  4.2.2. Dictionary Manipulation
  4.2.3. File Manipulation
  4.2.4. Counters
  4.2.5. String Manipulation
  4.2.6. SAORI Commands
  4.2.7. Communicate Commands
  4.2.8. Output Commands
  4.2.9. Auxiliary Commands
  4.2.10. Miscellaneous Commands
Appendix
 I. How To Add Inline Scripts
 II. Notes

1. Overview

Kawari Inline Script (KIS) is a simple language that can be used in the dictionary files of Kawari. By using inline scripts, you can add words to the dictionary while running Kawari, and perform processing according to events notified from the body.

2. Format

Inline script is described by enclosing it with "$(~)" in an entry definition. A block surrounded by one "$(~)" is called an "inline script block". Multiple statements can be written in one block. Separate statements with a semicolon (";"). A statement consists of a command and zero or more arguments. Separate commands, semicolons, and arguments with one or more spaces.

  Inline Script:
    Block

  Block:
    $(Statement)
    $(Statement ; Statement ; …)

  Statement:
    Commandname argument1 argument2 …

3. Evaluation, Return Value, Truth Judgment

When a block is interpreted by Kawari through an event call, an utterance request, etc., it is called "evaluation". When a block is evaluated, it returns a "return value". The return value is a single character string, and what kind of return value is returned depends on the command. Some commands always return """"(an empty string).

If a block consists of multiple statements, the return value of the block is the return value of all statements in the block in sequence. Note that if you don't want the block to return a return value, you can suppress it using the silent command.

When Kawari evaluates a return value and determines whether it is "true" or "false" in Boolean algebra, it uses the following criteria:

This truth/false judgment is common to both syntax commands and function commands, which will be described later. If you add your own commands, please use this standard for authenticity judgment.

4. Commands

Commands can be broadly classified into two categories: syntax commands, such as the if and while commands, and function commands, such as the adddict and date commands. Syntax commands control the flow of processing according to the truth or falsehood of given conditions. Function commands, on the other hand, perform the actual processing according to the given arguments. *1 *2

Where there is no danger of confusion, syntax commands are sometimes referred to as "syntax" and function commands as simply "commands".

4.1. Command List

Syntax Commands
ifEvaluates a statement and executes commands accordingly
foreachExecutes commands for all words in a specified entry
loopExecutes commands for a specified number of loops
silentSuppresses block outpu
untilLoops until a condition is met
whileLoops while a condition is true
breakBreaks out of a loop
continueReturns to the top of a loop
NULLReturns an empty string
?Randomly selects and evaluates
functionDefines a function
rmfuncDeletes a user created function
returnEscapes from a function

Function Commands
Dictionary Manipulation
Common Dictionary OperationsOperations Common to Dictionary Manipulation Commands
setSets a definition for an entry
setstrSets an entry to a string
adddictAdds a definiton to an entry
adddictstrAdds a string to an entry
pushAdds a definition to an entry
pushstrAdds a string to an entry
unshiftInserts a definition at the beginning of an entry
unshiftstrInserts a string at the beginning of an entry
insertInserts a definition at a specific position in an entry
insertstrInserts a string at a specific position in an entry
getGets all definitions in a dictionary
getcodeGets all definitions in an entry without evaluating them
getrandomGets a random definition from an entry
popRemoves the last word of an entry and returns it
popcodeRemoves the last word of an entry and returns it without evaluating it
shiftRemoves the first word of an entry and returns it
shiftcodeRemoves the first word of an entry and returns it without evaluting it
clearRemoves a string from an entry
cleartreeRemoves a string from an entry tree
sizeCounts the number of definitions in an entry
findReturns the first position of a string in an entry
rfindReturns the last position of a string in an entry
copyCopies an entry's content to another entry
copytreeCopies an entry tree's content while maintaining entry structure
moveMoves an entry's content to another entry
movetreeMoves an entry tree while maintaining entry structure
listsubGets a list of subentries
listtreeGet a list of entire entry tree
writeprotectMakes an entry unwritable
File Manipulation
saveSaves an entry to a file
savecryptEncrypts and saves an entry to a file
loadLoads a Kawari formatted dictionary file
textloadReads a text file
textappendAppends to a text file
textsaveSaves a text file
readdirLoads a directory
cncpathMakes the pathname available to the system
dirnameExtracts the directory name from a path name
filenameExtracts a file name from a path name
isexistDetermines if a file exists
isdirDetermines if a file is a directory
isfileDetermines if a file is a regular file
Counters
decConsiders the given entry definition as a number and subtracts from it
incConsiders the given entry definition as a number and adds to it
String Manipulation
lengthGets the length of a string
matchGets the first position of a substring
rmatchGets the last position of a substring
match_atDetermine if a substring exists at a specified position
substrGets substring
char_atGets the character at a specified position
subReplaces the first string that matches
gsubReplaces all matching strings
rsubReplaces the last matching string
trReplaces characters
reverseReverses a string
tolowerTurns all characters lowercase
toupperTurns all characters uppercase
chrReturns one character of a specified character code
splitSplits a string by a delimiter
joinJoins strings by a delimiter
compareCompares strings
SAORI
saoriregistRegisters a SAORI
saorieraseUnregisters a SAORI
saorilistReturns a list of register SAORIs
callsaoriCalls a registered SAORI
callsaorixCalls a registered SAORI (High functionality version)
Communicate Commands
communicateEvaluate all words in an entry and randomly select one from the values
matchallReturns true if all keywords are in a string
Output Commands
echoConnects arguments with whitespace characters and returns
encode_entrynameConverts to a valid entry name
escapeEscapes from SakuraScript in an argument
Auxiliary Commands
entryCalls an entry
entrycountReturn the total number of entries
evalRe-evaluates word
urllistOutputs recommendation list in SHIORI/2.5 format
wordcountReturns the total number of words
xargsExpands arguments and then executes them
Miscellaneous Commands
rccharsetSpecifies Character set setting of error messages
dateReturns the date and time in a specified format
mktimeConverts the date and time to elapsed in seconds
getenvReturns the contents of an environment variable
helpKIS Commandline help command
logfileSpecifies a logfile
loglevelSpecifies what to log
logprintOutputs to log
debuggerTurns Kosui ON or OFF
randReturns a random integer
srandSet the random number seed
Specifies security levelセキュリティレベルの指定
verGets Kawari version number

4.2. Command Reference

4.2.1. Syntax

break
Format $(break)
Return Value None
Function Exit loop syntax such as loop, until, while, foreach, etc.
Example
  # Check the word in the data entry and exit the loop if it is "END".
  $(
    setstr @count 0;
    loop $(size data) $(
      if $[ $data[${@count}] == "END" ] $(
        break;
      ) else $(
        inc @count;
      );
    );
    get data[${@count}];
  )
continue
Format $(continue)
Return Value None
Function In a loop syntax such as loop, until, while, foreach, etc., terminate the current loop process and enter the next loop process.
Example
  # Only words in the data entry that contain "ghost" are copied to the data2 entry.
  $(
    loop $(size data) $(
        setstr @count ${-1};
        echo $data[${@count}];
        if $[ $data[${@count} !~ "ghost" ] $(
            continue;
        );
        pushstr data2 $data[${@count}];
    );
  )
function
Format $(function FunctionName functionDefinition) $(function Functionname)
Return Value If provided two arguments, none. If provided one argument, return a string representation of the function definition.
Function

Define a function command. During the function definition, the "@arg" entry can be used as an argument. $@arg[0] is the function name, and the arguments start at $@arg[1]. The return value of the entire function definition is the return value of the function.

A command with the same name as a built-in function (but not a syntax command) can be defined. If a built-in command and a user-defined command with the same name exist, the user-defined command is invoked first. In this case, the original command can be called by prefixing it with ".". at the beginning of the command, the original built-in command can be forced to be called.

If the argument is only a function name, a string representation of the content of the function definition is returned. This return value is equivalent to writing the content of the function definition in an entry and calling the entry with the getcode command.

Example
  =kis
  # Define a function that returns the value set in the entry
  function tset $(
    # do nothing unless 2 arguments
    if $[ $(size @arg) != 3 ] $(return "");
    set $@arg[1] $(getcode @arg[2]);
    get @arg[2];
  );
  # Store the definition of user-defined function tset in funcdef entry
  set funcdef $(function tset);
  =end
if
Format $(if conditional statement true else false)
$(if conditional statement true else false)
$(if conditional statement true else if conditional statement 2 ...)
Return Value Returns the statement if true or false.
Function Executes a true-case statement or a false-case statement depending on the truth of the conditional statement. The else if clause can be connected to any number of clauses.
A space character or a newline character is always required before and after a command such as else.
Example 1
  $(if $[ ${mode} == "Y" ] "\0Yes\e" else "\0No\e")
    # Display "Yes" if the search is for "Y" in the content of the mode entry.
    # Otherwise, "No" is displayed

Example 2
  $(if "true" $(set a "1" ; set b "2") )
  # Sets entry a to 1, and entry b to 2 using a compound statement.

Example 3
  =dict
  a : 1
  b : 2
  =end
  
  =kis
  if $[ ${a} == "1" ] $(
    if $[ ${b} == "2"] $(
      echo "Overlapping";
    ) else $(
      echo "Not Overlapping";
    );
  ) else $(
    echo "Not Overlapping";
  );
  =end
  # Example of nesting if statements.
  # "Overlapping" is echoed.
foreach
Format $(foreach entry1 entry2 statement)
Return Value Result of evaluating statement for all words in entry 2
Function Set all of the definitions in entry2 to entry1 and evaluate the statement for each definition. If a substitution blcok is used for the string, enclose it with $(), etc.
Example
  $(set N 0 ; foreach i npw $(echo "Sir "${i}", "; inc N); echo ${N}" people")
  # Call "Sir "${i}", " for every person name in the npw entry as i,
  # and display the number of people at the end with ${N}" people".
loop
Format $(loop count statement1)
Return Value Evaluates statement1 for the number of times specified.
Function Repeatedly evaluates statement1 for the number of times specified. If a substitution block is used for the count and/or statement 1, enclose it with $(), etc.
Example
  $(loop 10 "tick!")
  # Display "tick!" 10 times.
return
Format $(return value)
Return Value Returns the specified value.
Function Exit immediately with the specified return value from the function. If the return value is omitted, the output of the previous function becomes the return value of the function.
Example
  =kis
  function RPS $(
    if $[ $@arg[1] == 1 ] $(
      return "Rock";
    ) else if $[ $@arg[1] == 2 ] $(
      return "Scissors";
    ) else $(
      return "Paper";
    );
  );
  =end
rmfunc
Format $(rmfunc userFunction)
Return Value None
Function

Delete user-defined function commands.

Example
  =kis
  # Delete command my_find
  rmfunc my_find;
  =end
silent
Format $(silent)
Return Value None
Function During a multi-statement block, return values before SILENT are discarded.
Example
  $(echo 1 ; echo 2 ; silent ; echo 3)
  # 3 is returned.
Reference
  $(echo 1 ; echo 2 ; echo 3)
  # 123 is returned.
until
Format $(until condition statement1)
Return Value Returns the value of statement1.
Function Evaluates the conditional statement, and if false, evaluates statement1. This will loop until the condition is met. If a substitution block is used for the condition or statement1, enclose it with $(), etc.
Example
  =kis
  setstr A ${npw};
  setstr B ${npw};
  until $[ ${A} != ${B} ] $(
    setstr B ${npw};
  );
  # Makes sure A and B entries are always different.
  =end
while
Format $(while condition statement1)
Return Value Returns the value of statement1.
Function Evaluates the conditional statement, and if true, evaluates statement1. This will loop until the condition is no longer met. If a substitution block is used for the condition or statement1, enclose it with $(), etc.
Example
  =kis
  setstr A ${npw};
  setstr B ${npw};
  while $[ ${A} == ${B} ] $(
    setstr B ${npw};
  );
  # Makes sure A and B entries are always different.
  =end
NULL
Format $(NULL)
Return Value None (empty string)
Function Returns an empty string, equivalent to "". Remains for historical compatibility and debugging convenience.
例
  =kis
  if $[ ${test1} == $(NULL) ] $(
    echo "test1 is empty.";
  );
  =end
  # if test1 is an empty entry or evaluation result is "",
  # return "entry1 is empty".
?
Format $(? string1 string2 ... string*)
Return Value Returns any statement from 1 through *, where * is an integer.
Function Evaluates a statement from 1 through *, where * is an integer, randomly. Substitute for extended makoto.
Example
  "Go "$(? "right" "left")"."
  # Returns "Go right." or "Go left." randomly.

4.2.2. Dictionary Manipulation

Common Dictionary Operations
  Among the dictionary manipulation commands, the word/string set/add/insert command, get, getcode, and clear commands commonly have the ability to treat entries as an array. In these commands, the entry name can be written as follows:
  • If "entry1" is written, it refers to the entire entry 1.
  • "entry1[0]" refers to the first definition of entry 1.
  • "entry1[0..3]" refers to the first through fourth definitions of entry 1.
  • "entry1[-1]" refers to the last definition of entry 1.
  • "entry1[-2..-4]" refers to the second to last and fourth to last definitions of entry 1.
Note that the words in [ ] are 0-origin as in the entry array call. If a non-existent subscript is specified in [ ], it is ignored. Note that although the above functions look and function similar to entry array calls, they are completely unrelated functions.
Example
  word : "one" , "two" , "three" , "four" , "five" , "six" , "seven"
  
  =kis
  setstr word[4] "5th element";
  # Replace the fifth word in the word entry with "5th element".
  
  setstr word2[0..5] "initial value";
  # Set the first six elements to the string "initial value" in the word2 entry.
  
  clear word[1];
  # Remove the second word (two) in the word entry.

  get word;
  # Return "onethreefour5th elementsixseven".
  
  get word[100];
  # Return nothing since there are only six elements in the word entry.
  =end
adddict
Format $(adddict entry1 definition1)
Return Value None
Function Add definition1 to entry1. The format common to dictionary manipulation commands can be used with the entry name.
Example
  =kis
  # Add "Makiko Tanaka" to the npw entry.
  adddict npw "Makiko Tanaka";
  
  # Add the definition of the npw entry to name entry.
  adddict name ${npw}
  
  # Add the string "${normal}" to entry Act.
  adddict Act "${normal}";
  
  # Execute the following line to call the word in the "normal" entry.
  echo ${Act};
  =end
adddictstr
Format $(adddictstr エントリ1 文字列1)
Return Value なし
Function エントリ1に文字列1を追加する。adddictとの違いは、 追加したものが必ず置換ブロックではなく、文字列になる点である。
エントリ名の指定には、辞書操作コマンド共通の書式を利用できる。
例
  =kis
  # npwエントリに「田中真紀子」を追加
  adddictstr npw 田中真紀子;
  
  # nameエントリにnpwエントリ中の単語を追加
  adddictstr name ${npw}
  
  # Actエントリに文字列「${normal}」を追加
  adddictstr Act "${normal}";
  
  # 次の行を実行すると、「${normal}」を返す。
  echo ${Act};
  =end
clear
Format $(clear エントリ1)
Return Value なし
Function エントリ1から単語を削除する。
エントリ名の指定には、辞書操作コマンド共通の書式を利用できる。
例
  test1 : word1, word2, word3

  =kis
  foreach @word test1 $(echo ${@word})
  # 「word1word2word3」を返す

  clear test1;
  # test1エントリの内容を全て消去

  foreach @word test1 $(echo ${@word})
  # 何も返さない
  =end
cleartree
Format $(cleartree エントリ1)
Return Value なし
Function 「エントリ1.」で名前が始まるエントリの内容を全て削除する。 例えば「エントリ1.a」、「エントリ1.b」というエントリがあったとすると、 これらの内容が削除される。
例
  ghost1.name : まゆら
  ghost1.shiori : 華和梨
  ghost1.shiori.phase : 7.3.1
  ghost1.author : 夢蛍
  ghost1.shell : サンタ,着せ替え,白,夏服
  
  =kis
  cleartree ghost1;
  =end
  # 上記エントリの内容は全て削除される
copy
Format $(copy エントリ1 エントリ2)
Return Value なし
Function エントリ1の内容を、すべてエントリ2にコピーする。 エントリ2の以前の内容はそのまま残り、 エントリ1の内容をエントリ2に追加する。
例
  ghost1 : さくら , まゆら , 奈留 , 理夢 , ${ghost2}
  ghost2 : サンバーレイン , 毒子 , 花ちゃん
  
  =kis
  copy ghost1 ghost3;
  
  getcode ghost3;
  # 「"さくら""まゆら""奈留""理夢"${ghost2}」が返る
  
  size ghost1;
  # 5が返る
  =end
copytree
Format $(copytree エントリ1 エントリ2)
Return Value なし
Function 「エントリ1.」で名前が始まるエントリの構造を、エントリ2にコピーする。 例えば「エントリ1.a」、「エントリ1.b」というエントリがあったとすると、 それぞれの内容を「エントリ2.a」、「エントリ2.b」エントリにコピーする。
例
  ghost1.name : まゆら
  ghost1.shiori : 華和梨
  ghost1.shiori.phase : 7.3.1
  ghost1.author : 夢蛍
  ghost1.shell : サンタ,着せ替え,白,夏服
  
  =kis
  copytree ghost1 ghost2;
  =end
  # 「ghost2.」で始まるエントリの内容が、次のようになる
  # ghost2.name : まゆら
  # ghost2.shiori : 華和梨
  # ghost2.shiori.phase : 7.3.1
  # ghost2.author : 夢蛍
  # ghost2.shell : サンタ,着せ替え,白,夏服
find
Format $(find エントリ1 単語1)
$(find エントリ1 単語1 インデックス)
Return Value 単語1の位置。見つからなかった場合"-1"。
Function エントリ1内で、単語1が現れる最初の位置を返す。 インデックスが指定された場合、そのインデックス以降で、 最後に現れる位置を返す。 インデックスは整数でなければならない。
例
  地名: ここ, ${人名}の家, 三丁目, ここ, ${人名}の仕事場
  候補: ${人名}の家

  =kis
  find 地名 ここ;
  # "0"が返る。

  find 地名 ここ 1;
  # "3"が返る。

  find 地名 "${人名}"の家;
  # "1"が返る。

  find 地名 $(getcode 候補[0]);
  # "1"が返る。
  =end
get
Format $(get エントリ1)
Return Value エントリ1の指定範囲の単語を全て評価した結果
Function エントリ1の指定範囲の単語を、添え字昇順で全て評価し、 結果を結合して返す。指定範囲を省略した場合、 エントリ1の全単語が対象となる。
エントリ名の指定には、辞書操作コマンド共通の書式を利用できる。
例
  word1 : あ , い , う , え , お
  word2 : $(date %y) , $(date %M) , $(date %d)

  =kis
  get word1;
  # 「あいうえお」を返す
  get word2;
  # 「20020425」の形式で今日の日付を返す
  =end
getcode
Format $(getcode エントリ1)
Return Value エントリ1の指定範囲の単語を全て評価前の形式で結合した結果
Function エントリ1の指定範囲の単語を、添え字昇順で全て評価せずに参照し、 結果を結合して返す。指定範囲を省略した場合、 エントリ1の全単語が対象となる。
エントリ名の指定には、辞書操作コマンド共通の書式を利用できる。
例
  word1 : あ , い , う , え , お
  word2 : $(date %y) , $(date %M) , $(date %d)

  =kis
  get word1;
  # 「"あ""い""う""え""お"」を返す
  get word2;
  # 「$(date %y)$(date %M)$(date %d)」を返す
  =end
getrandom
Format $(getrandom エントリ1 単語1)
Return Value エントリ1の単語のいずれか、または単語1
Function エントリ1の単語をランダムに1つ選択し、評価結果を返す。 エントリ1に単語が無かった場合、単語1を返す。 機能はentryとまったく同じである。
例
  =kis
  getrandom "npw";
  # ${npw}と同じ
  
  getrandom "message."$(rand 3);
  # ${message.0}から${message.2}のどれかと同じ

  getrandom "System.OtherGhost" ${myname};
  # ${System.OtherGhost}と同じ
  # 結果が空の場合は、${myname}の戻り値が返る
  =end
insert
Format $(insert エントリ1[インデックス1] 単語1)
Return Value なし
Function エントリ1の「インデックス1+1」番目の単語の直前に、単語1を挿入する。
エントリ名の指定には、辞書操作コマンド共通の書式を利用できる。
例
  word : 1 , 2 , 3 , 4 , 5 , 6 , 7
  key : AAA
  
  =kis
  get word;
  # 「1234567」が返る
  
  insert word[3] "${key}";
  
  get word;
  # 「123AAA4567」が返る
  =end
insertstr
Format $(insertstr エントリ1[インデックス1] 文字列1)
Return Value なし
Function エントリ1の「インデックス1+1」番目の単語の直前に、文字列1を挿入する。 insertとの違いは、 追加したものが必ず置換ブロックではなく、文字列になる点である。
エントリ名の指定には、辞書操作コマンド共通の書式を利用できる。
例
  word : 1 , 2 , 3 , 4 , 5 , 6 , 7
  key : AAA
  
  =kis
  get word;
  # 「1234567」が返る
  
  insertstr word[3] "${key}";
  
  get word;
  # 「123${key}4567」が返る
  =end
listsub
Format $(listsub エントリ1 エントリ2)
Return Value なし
Function 「エントリ2.」で名前が始まり、それ以上「.」が含まれないエントリ名の一覧を、エントリ1に追加する。 エントリ2に「.」を指定すると、最上位(「.」を全く含まない)エントリ名の一覧が得られる。
例
  ghost1.name : まゆら
  ghost1.shiori : 華和梨
  ghost1.shiori.phase : 7.3.1
  ghost1.author : 夢蛍
  ghost1.shell : サンタ,着せ替え,白,夏服
  
  =kis
  listsub 一覧 ghost1;

  getcode 一覧;
  # "ghost1.name""ghost1.shiori""ghost1.author""ghsot1.shell"が返る。
listtree
Format $(listtree エントリ1 エントリ2)
Return Value なし
Function 「エントリ2.」で名前が始まるエントリ名一覧を、エントリ1に追加する。 エントリ2に「.」を指定すると、全エントリ名一覧を取得できる。
例
  =kis
  listtree SHIORI System.Request;
  # SHIORIエントリに、本体からのリクエストヘッダ一覧を追加する
  
  listree Entries .;
  # 全エントリ名をEntriesエントリに追加。主に今は亡き対GET Status用
move
Format $(move エントリ1 エントリ2)
Return Value なし
Function エントリ1の内容を、すべてエントリ2に移す。 実行後、エントリ1の内容は削除される。 エントリ2の以前の内容はそのまま残り、 エントリ1の内容をエントリ2に追加する。
例
  ghost1 : さくら , まゆら , 奈留 , 理夢 , ${ghost2}
  ghost2 : サンバーレイン , 毒子 , 花ちゃん
  
  =kis
  move ghost1 ghost3;
  
  getcode ghost3;
  # 「"さくら""まゆら""奈留""理夢"${ghost2}」が返る
  
  size ghost1;
  # 0が返る
  =end
movetree
Format $(movetree エントリ1 エントリ2)
Return Value なし
Function 「エントリ1.」で名前が始まるエントリの構造を、エントリ2に移す。 例えば「エントリ1.a」、「エントリ1.b」というエントリがあったとすると、 それぞれの内容を「エントリ2.a」、「エントリ2.b」エントリにコピーする。 その後エントリ1.a、エントリ1.b等を削除する。
例
  ghost1.name : まゆら
  ghost1.shiori : 華和梨
  ghost1.shiori.phase : 7.3.1
  ghost1.author : 夢蛍
  ghost1.shell : サンタ,着せ替え,白,夏服
  
  =kis
  movetree ghost1 ghost2;
  =end
  # 「ghost2.」で始まるエントリの内容が、次のようになる
  # ghost2.name : まゆら
  # ghost2.shiori : 華和梨
  # ghost2.shiori.phase : 7.3.1
  # ghost2.author : 夢蛍
  # ghost2.shell : サンタ,着せ替え,白,夏服
pop
Format $(pop エントリ1)
Return Value エントリ1の末尾の単語
Function エントリ1の末尾にある単語を削除し、それを返す。 エントリ1に単語が無ければ、空文字列を返す。
例
  PASOPIA : パソピア7
  oldmachine : PC9801,X68k,MSX2,PC8801,X1,PC8001,${PASOPIA}
  
  =kis
  foreach @pc oldmachine $(echo " "${@pc});
  # 「 PC9801 X68k MSX2 PC8801 X1 PC8001 パソピア7」を返す
  
  pop oldmachine;
  # 「パソピア7」を返す
  
  foreach @pc oldmachine $(echo " "${@pc});
  # 「 PC9801 X68k MSX2 PC8801 X1 PC8001」を返す
  =end
popcode
Format $(popcode エントリ1)
Return Value エントリ1の末尾の単語の評価前の形式
Function エントリ1の末尾にある単語を削除し、評価前の形式で返す。 エントリ1に単語が無ければ、空文字列を返す。
例
  PASOPIA : パソピア7
  oldmachine : PC9801,X68k,MSX2,PC8801,X1,PC8001,${PASOPIA}
  
  =kis
  foreach @pc oldmachine $(echo " "${@pc});
  # 「 PC9801 X68k MSX2 PC8801 X1 PC8001 パソピア7」を返す
  
  popcode oldmachine;
  # 「${PASOPIA}」を返す
  
  foreach @pc oldmachine $(echo " "${@pc});
  # 「 PC9801 X68k MSX2 PC8801 X1 PC8001」を返す
  =end
push
Format $(push エントリ1 単語1)
Return Value なし
Function エントリ1の末尾に単語1を追加する。adddictと同義。
エントリ名の指定には、辞書操作コマンド共通の書式を利用できる。
例
  =kis
  # npwエントリに「田中真紀子」を追加
  push npw 田中真紀子;
  
  # nameエントリにnpwエントリ中の単語を追加
  push name ${npw}
  
  # Actエントリに単語「${normal}」を追加
  push Act "${normal}";
  
  # 次の行を実行すると、normalエントリの中を単語を呼び出す
  echo ${Act};
  =end
pushstr
Format $(pushstr エントリ1 文字列1)
Return Value なし
Function エントリ1の末尾に文字列1を追加する。adddictstrと同義。
エントリ名の指定には、辞書操作コマンド共通の書式を利用できる。
例
  =kis
  # npwエントリに「田中真紀子」を追加
  pushstr npw 田中真紀子;
  
  # nameエントリにnpwエントリ中の単語を追加
  pushstr name ${npw}
  
  # Actエントリに文字列「${normal}」を追加
  pushstr Act "${normal}";
  
  # 次の行を実行すると、「${normal}」を返す。
  echo ${Act};
  =end
rfind
Format $(rfind エントリ1 単語1)
$(rfind エントリ1 単語1 インデックス)
Return Value 単語1の位置。見つからなかった場合"-1"。
Function エントリ1内で、単語1が現れる最後の位置を返す。 インデックスが指定された場合、そのインデックス以前で、 最後に現れる位置を返す。 インデックスは整数でなければならない。
例
  地名: ここ, ${人名}の家, 三丁目, ここ, ${人名}の仕事場
  候補: ${人名}の家

  =kis
  rfind 地名 ここ;
  # "3"が返る。

  rind 地名 ここ 2;
  # "0"が返る。

  rfind 地名 "${人名}"の家;
  # "1"が返る。

  rfind 地名 $(getcode 候補[0]);
  # "1"が返る。
  =end
set
Format $(set エントリ1 単語1)
Return Value なし
Function エントリ1の内容を削除してから、単語1を登録する。
エントリ名の指定には、辞書操作コマンド共通の書式を利用できる。
例
  dummy : 1
  angry : 怒ってるゾ!
  
  =kis
  set mode 1;
  # modeエントリの内容は「1」だけになる
  
  set mody ${dummy};
  # modeエントリの内容は${dummy}=「1」になる
  
  set emotion "${angry}";
  # emotionエントリの内容は単語「${angry}」になる
  
  echo ${emotion};
  # 「怒ってるゾ!」を返す
  
  =end
setstr
Format $(setstr エントリ1 文字列1)
Return Value なし
Function エントリ1の内容を削除してから、文字列1を登録する。 setとの違いは、 追加したものが必ず置換ブロックではなく、文字列になる点である。
エントリ名の指定には、辞書操作コマンド共通の書式を利用できる。
例
  dummy : 1
  angry : 怒ってるゾ!
  
  =kis
  setstr mode 1;
  # modeエントリの内容は「1」だけになる
  
  setstr mody ${dummy};
  # modeエントリの内容は${dummy}=「1」になる
  
  setstr emotion "${angry}";
  # emotionエントリの内容は文字列「${angry}」になる
  
  echo ${emotion};
  # 「${angry}」を返す
  
  =end
shift
Format $(shift エントリ1)
Return Value エントリ1の先頭にある単語
Function エントリ1の先頭にある単語を一つ削除し、それを返す。 エントリ1に単語が無ければ、空文字列を返す。
例
  counter : 1, 2, 3, 4, 5
  sentence : \hこの文が呼ばれるのは$(shift counter)回目だね。\e
shiftcode
Format $(shiftcode エントリ1)
Return Value エントリ1の先頭にある単語の評価前の形式
Function エントリ1の先頭にある単語を一つ削除し、評価前の形式で返す。 エントリ1に単語が無ければ、空文字列を返す。
例
  counter : 1, 2, 3, 4, 5
  sentence : \hこの文が呼ばれるのは$(shiftcode counter)回目だね。\e
size
Format $(size エントリ1)
Return Value 単語数
Function エントリ1中の単語数を返す。
例
  理夢 : 理夢
  ninni.angels,famous.ghosts : 奈留, せりこ, まゆら, ${理夢}
  dark.sisters,famous.ghosts : 毒子, 花ちゃん, サンバーレイン, ${理夢}
  
  =kis
  size dark.sisters;
  # 4が返る
  
  size famous.ghosts;
  # 8が返る
  =end
unshift
Format $(unshift エントリ1 単語1)
Return Value なし
Function エントリ1の先頭に単語1を挿入する。
例
  ghosts : まゆら,理夢,毒子,白子,美耳,陽子
  任意 : さくら
  
  =kis
  get ghosts;
  # 「まゆら理夢毒子白子美耳陽子」を返す
  
  unshift ghosts "${任意}";
  
  get ghosts;
  # 「さくらまゆら理夢毒子白子美耳陽子」を返す
  =end
unshiftstr
Format $(unshiftstr エントリ1 文字列1)
Return Value なし
Function エントリ1の先頭に文字列1を挿入する。 unshiftとの違いは、 追加したものが必ず置換ブロックではなく、文字列になる点である。
例
  ghosts : まゆら,理夢,毒子,白子,美耳,陽子
  任意 : さくら
  
  =kis
  get ghosts;
  # 「まゆら理夢毒子白子美耳陽子」を返す
  
  unshift ghosts "${任意}";
  
  get ghosts;
  # 「${任意}まゆら理夢毒子白子美耳陽子」を返す
  =end
writeprotect
Format $(writeprotect エントリ1)
Return Value なし
Function エントリ1を(起動中)書き込み不可にする。 従来resource.homeurlなどはシステム側でプロテクトしていたが、 Phase 8では重要情報がどこに書かれるか分からないため、 ユーザやミドルウェアが自分でプロテクトをかけられるようにした。 プロテクトを外すコマンドは存在しない。 プロテクトされたエントリに書き込もうとした場合、Errorレベルのログが出力される。
例
  username : ご主人様

  =kis
  writeprotect username;
  =end

4.2.3. コマンド-ファイル操作

cncpath
Format $(cncpath パス名) $(cncpath パス名 ファイル名)
Return Value 正規化したパス名
Function パス区切り記号に'/'と'\'が混在したパス名を、 実装したファイルシステムで適切なパス区切り記号に変換して返す。 ファイル名も指定した場合、パスと適切な形で結合して、 同じように適切なパス区切り記号で返す。 パスとして解釈できない場合、何も返さない。
例
  =kis
  # ここではMS Windows上のオリジナル華和梨を想定している
  
  # "..\..\unix"が返る
  cncpath ../../unix;
  
  # "C:\WINDOWS\SYSTEM"が返る
  cncpath C:/WINDOWS\SYSTEM
  
  # "..\..\UNIX\LS.EXE"が返る
  cncpath ../../UNIX/ LS.EXE
  =end
dirname
Format $(dirname パス名)
Return Value 正規化したディレクトリ名
Function 与えられたパス名をcncpathで正規化し、 ディレクトリ名部分を抽出して返す。
例
  =kis
  # ここではMS Windows上のオリジナル華和梨を想定している
  
  # "C:\Program Files\Microsoft Office\Office"が返る
  dirname "C:/Program Files/Microsoft Office/Office/POWERPNT.EXE"
  =end
filename
Format $(filename パス名)
Return Value ファイル名
Function 与えられたパス名をcncpathで正規化し、 ファイル名部分を抽出して返す。
例
  =kis
  # ここではMS Windows上のオリジナル華和梨を想定している
  
  # "POWERPNT.EXE"が返る
  filename "C:/Program Files/Microsoft Office/Office/POWERPNT.EXE"
  =end
isdir
Format $(isdir パス名)
Return Value パスがディレクトリならば真、そうでなければ偽
Function 与えられたパス名がディレクトリかどうか判定する。 パスがディレクトリならば真、そうでなければ偽を返す。 パスのファイルが存在しない場合の動作は不定である。
例
  =kis
  # MATERIAのghost\masterフォルダで実行した場合を想定
  
  isdir $(cncpath profile);
  # 1が返る
  isdir shiori.dll;
  # ""が返る
  =end
isexist
Format $(isexist パス名)
Return Value パスが存在すれば真、そうでなければ偽
Function 与えられたパス名が存在するかどうか判定する。 パスが存在すれば真、そうでなければ偽を返す。
例
  =kis
  # MATERIAのghost\masterフォルダで実行した場合を想定
  
  isexist $(cncpath profile);
  # 1が返る
  isexist shiori.dll;
  # 1が返る
  isexist $(cncpath ..\..\..\..\embryo.exe);
  # ""が返る
  =end
isfile
Format $(isfile パス名)
Return Value パスが通常ファイルならば真、そうでなければ偽
Function 与えられたパス名が通常ファイルかどうか判定する。 パスが通常ファイルならば真、そうでなければ偽を返す。 パスのファイルが存在しない場合の動作は不定である。
例
  =kis
  # MATERIAのghost\masterフォルダで実行した場合を想定
  
  isfile $(cncpath profile);
  # ""が返る
  isfile shiori.dll;
  # 1が返る
  =end
load
Format $(load ファイル名)
Return Value なし
Function 華和梨辞書形式ファイルを読み込む。暗号化辞書も可。 ファイル名の先頭が「/」「\」またはドライブ名から始まる場合には 絶対パスとみなし、それ以外の場合にはゴーストのディレクトリからの 相対パスとみなす。
例
  =kis
  load dict-flag.txt;
  # dict-flag.txtを読み込む
  =end
readdir
Format $(readdir エントリ1 ディレクトリ)
Return Value なし
Function 指定ディレクトリに含まれるファイル・ディレクトリ名を エントリ1に保存する。エントリ1の以前の内容は消去される。
ディレクトリ名は相対パスも可。カレントディレクトリの'.'、 親ディレクトリの'..'は予め削除される。
例
  =kis
  readdir shell "..\..\shell";
  # 自ゴーストで使用できるシェル一覧をshellに保存
  =end
save
Format $(save ファイル名 エントリ名1 ... )
Return Value なし
Function ファイルにエントリ内容を華和梨辞書形式でセーブする。 指定ファイルの以前の内容は消去し、 指定エントリ群の内容でファイルを上書きする。
例
  =kis
  save dict-flag.txt flag1 flag2 flag3;
  # flag1、flag2、flag3エントリをdict-flag.txtに保存
  =end
savecrypt
Format $(savecrypt ファイル名 エントリ名1 ... )
Return Value なし
Function ファイルにエントリ内容を暗号化華和梨辞書形式でセーブする。 指定ファイルの以前の内容は消去し、 指定エントリ群の内容でファイルを上書きする。
例
  =kis
  savecrypt dict-flag.txt flag1 flag2 flag3;
  # flag1、flag2、flag3エントリをdict-flag.txtに暗号化して保存
  =end
textappend
Format $(textappend ファイル名 エントリ1 [エントリ2..])
Return Value なし
Function エントリ1、エントリ2…の全ての内容を、テキストファイル1に追記する。 セキュリティの観点から、書き出すファイル名は相対パスのみである。 エントリの内容は、添え字順に評価してその結果を書き出す。 ファイルに書き出す際、添え字ごとに最後に改行する。 textsaveとの違いは、テキストファイル1の以前の内容が残る点である。
例
  =kis
  textappend highscore.dat 新タイトル保持者名;
  # highscore.datに、「新タイトル保持者名」エントリの内容を追記
  =end
textload
Format $(textload エントリ1 テキストファイル1)
Return Value なし
Function テキストファイル1の内容を読み込む。
ファイルの1行目はエントリ1の一つ目の単語、 2行目はエントリ1の二つ目の単語となる。 行末の改行コードは、削除してからエントリに格納する。
例
  =kis
  textload poem mypoem.txt;
  # poemエントリにファイル'mypoem.txt'を読み込む
  
  echo \0$(set @i 0 ; loop $(size poem) $(get poem[${@i}] ; inc @i))\e;
  # ファイルmypoem.txtの内容を読み込み、さくら側バルーンで内容を表示する
  =end
textsave
Format $(textsave ファイル名 エントリ1 [エントリ2..])
Return Value なし
Function エントリ1、エントリ2…の全ての内容を、テキストファイル1に書き出す。 セキュリティの観点から、書き出すファイル名は相対パスのみである。 エントリの内容は、添え字順に評価してその結果を書き出す。 ファイルに書き出す際、添え字ごとに最後に改行する。 textappendとの違いは、テキストファイル1の以前の内容が残らない点である。
例
  =kis
  textsave highscore.dat タイトル保持者名一覧;
  # highscore.datに、「タイトル保持者名一覧」エントリの内容を保存
  =end

4.2.4. コマンド-カウンタ

dec
Format $(dec エントリ1 減分 下限)
Return Value なし
Function エントリ1を減分だけ減算する。減分と下限は省略可能。 減分を省略した場合、1と見なす。 減算した結果が下限より小さくなった場合、エントリ1の内容は下限となる。 下限を省略するといつまでも減算できる。
エントリ名の指定には、辞書操作コマンド共通の書式を利用できる。
例
  =kis
  dec N;
  # Nを1だけ減らす
  
  dec N 5;
  # Nを5だけ減らす
  
  dec N 10 0;
  # Nを10だけ減らし、結果が0より小さければNは0とする
  
  dec N[0];
  # N[0]を1だけ減らす
  
  dec N[0..3] 2 0;
  # N[0]からN[3]までをそれぞれ2だけ減らし、結果が0より小さければ0とする
  =end
inc
Format $(inc エントリ1 増分 上限)
Return Value なし
Function エントリ1を増分だけ加算する。増分と上限は省略可能。 増分を省略した場合、1と見なす。 加算した結果が上限より大きくなった場合、エントリ1の内容は上限となる。 上限を省略するといつまでも加算できる。
エントリ名の指定には、辞書操作コマンド共通の書式を利用できる。
例
  =kis
  inc N;
  # Nを1だけ増やす
  
  inc N 5;
  # Nを5だけ増やす
  
  inc N 10 100;
  # Nを10だけ増やし、結果が100より大きければNは100とする
  
  inc N[2] 4;
  # N[2]を4だけ増やす
  
  inc N[1..-1] 2 100;
  # N[0]以外のNをそれぞれ2だけ増やし、結果が100より大きければ100とする
  =end

4.2.5. 文字列操作

char_at
Format $(char_at 文字列1 インデックス)
Return Value 文字列1の「インデックス+1」文字目の文字
Function 指定文字列の指定した場所の1文字を返す。 マルチバイト文字も1文字と数える。 インデックスは0オリジンであることに注意。
例
  =kis
  char_at 世界よ、こんにちは。 2;
  # 「よ」が返る
  =end
chr
Format $(chr 文字コード)
Return Value 指定した文字コードの一文字
Function 指定した文字コードの一文字を返す。
例
  =kis
  chr 1;
  # いわゆる「バイト値1」が返る
  
  chr 2;
  # いわゆる「バイト値2」が返る
  =end
compare
Format $(compare 文字列1 文字列2)
Return Value -1、0、1のいずれか
Function 文字列同士を辞書順序で比較する。 文字列1が文字列2より辞書順で後ならば1、 文字列1が文字列2より辞書順で前ならば-1、 文字列1と文字列2が等しければ0を返す。
例
  dict : a , aa , b , c , xa , xy , z
  word : hello
  
  =kis
  setstr @count 0;
  loop $(size dict) $(
    if $[ $(compare $dict[${@count}] ${word}) < 1 ] $(
      inc @count;
    ) else $(
      break;
    );
  );
  insertstr dict[${@count}] ${word};
  
  # compareを使った大小比較の例
  # 辞書順にソートしたエントリに対し、添え字0から${word}と比較し、
  # ${word}より大きな単語の直前に${word}を挿入している
  =end
gsub
Format $(gsub 文字列1 パターン 置換文字列)
Return Value 置換後の文字列
Function 指定文字列中に指定パターンがあった場合、置換文字列で置き換える。 subとの違いは、指定文字列中に指定パターンが複数あった場合、 全て置換する点である。
例
  =kis
  gsub hogehogehoge ge ro;
  # 「horohorohoro」が返る
  =end
join
Format $(join エントリ1 区切り文字)
Return Value 結合後の文字列
Function エントリ1の内容を、区切り文字を間に挟んで順に結合して返す。 結合の際、エントリ1の内容は順に評価される。
区切り文字は省略可能で、省略した場合はヌル文字「""」をした場合と同じ。
例
  path : WINDOWS, SYSTEM32, drivers, etc
  =kis
  join path "\\";
  # 「WINDOWS\SYSTEM32\drivers\etc」が返る
  =end
length
Format $(length 文字列1)
Return Value 文字列1の長さ
Function 指定文字列の長さを返す。 マルチバイト文字1字も長さ1である。
例
  =kis
  length とても長くてすぐには何文字か分からない1byte文字も交えた例;
  # 31が返る
  =end
match
Format $(match 文字列1 パターン インデックス)
Return Value パターンの文字列1の中における先頭位置
Function 指定文字列中に指定パターンがあった場合、その先頭の位置を返す。 インデックスは省略可能で、指定した場合、 指定文字列の「インデックス+1」文字目から検索を始める。 省略した場合、指定文字列の先頭から検索を始める。 戻り値は0オリジンで、パターンが存在しなかった場合、 -1を返す。
例
  =kis
  match 芝村をやっている 村を;
  # 1が返る
  
  match あーりーあーもー殺ーるーのー あー 2;
  # 4が返る
  
  match 我は、我である。 ジャム;
  # -1が返る
  =end
match_at
Format $(match_at 文字列1 パターン インデックス)
Return Value パターンがあれば1、なければ""
Function 文字列中のインデックス番目(0オリジン)にパターンが存在すれば1。 存在しなければ""を返す。 指定省略時のインデックスは0.
例
  =kis
  match_at 芝村をやっている 村を;
  # ""が返る
  
  match_at 芝村をやっている 村を 1;
  # 1が返る
  
  match_at あーりーあーもー殺ーるーのー あー 4;
  # 1が返る
  
  match_at 我は、我である。 ジャム;
  # ""が返る
  =end
reverse
Format $(reverse 文字列1)
Return Value 前後が逆になった文字列
Function 文字列の前後を入れ替える。 バイト単位ではなく、文字単位で入れ替えることに注意。
例
  =kis
  reverse 上から読んでも山本山
  # 「山本山もでん読らか上」が返る
  =end
rmatch
Format $(rmatch 文字列1 パターン インデックス)
Return Value パターンの文字列1の中における先頭位置
Function 指定文字列中に指定パターンがあった場合、その先頭の位置を返す。 インデックスは省略可能で、指定した場合、 指定文字列の「インデックス+1」文字目から、前方に向けて検索を始める。 省略した場合、指定文字列の最後尾から前方に向けて検索を始める。 戻り値は0オリジンで、パターンが存在しなかった場合、 -1を返す。
例
  =kis
  rmatch 芝村をやっている 村を;
  # 1が返る
  
  rmatch あーりーあーもー殺ーるーのー あー 2;
  # 0が返る
  
  rmatch 我は、我である。 ジャム;
  # -1が返る
  =end
rsub
Format $(rsub 文字列1 パターン 置換文字列)
Return Value 置換後の文字列
Function 指定文字列中に指定パターンがあった場合、置換文字列で置き換える。 gsubとの違いは、指定文字列中に指定パターンが複数あった場合、 最後尾の1つだけ置換する点である。
例
  =kis
  rsub hogehogehoge ge ro;
  # 「hogehogehoro」が返る
  =end
split
Format $(split エントリ1 文字列1 区切り文字列1)
Return Value なし
Function 文字列1を区切り文字列1で分割し、エントリ1に格納する。 エントリ1の以前の内容はそのまま残り、 新たに格納される文は、エントリ1にpushされる。
区切り文字1は省略可能で、 省略した場合は文字列1を文字ごとに分割する。
例
  =kis
  split string "AA:BB:CC" ":";
  # AA、BB、CCに分割
  
  split Header ${System.GhostEx} $(chr 1);
  # GhostExヘッダをバイト値1で分割
  
  split Msg "籠の中の鳥" "の";
  # 籠、中、鳥に分割
  
  split test "1ch2ch3ch" "ch";
  # 1、2、3に分割
  
  split char "世界よ、こんにちは!";
  # "世界よ、こんにちは!"を文字ごとに分割
  =end
sub
Format $(sub 文字列1 パターン 置換文字列)
Return Value 置換後の文字列
Function 指定文字列中に指定パターンがあった場合、置換文字列で置き換える。 gsubとの違いは、指定文字列中に指定パターンが複数あった場合、 先頭の1つだけ置換する点である。
例
  =kis
  sub hogehogehoge ge ro;
  # 「horohogehoge」が返る
  =end
substr
Format $(substr 文字列1 開始位置 長さ)
Return Value 部分文字列
Function 文字列1の部分文字列を返す。文字列1の「開始位置+1」文字目から、 「長さ」文字分を返す。位置は0オリジンである。 長さは省略でき、省略した場合、 開始位置から末尾までを返す。 位置が負の数の場合、末尾から数えた位置になる。
例
  =kis
  substr ABCDEFG 3 2;
  # 「DE」を返す
  
  substr ABCDEFG 3;
  # 「DEFG」を返す
  =end
tolower
Format $(tolower 文字列1 ...)
Return Value 文字列中のアルファベット大文字を小文字に置換した結果
Function 文字列中のアルファベット大文字を小文字に置換する。 半角文字のみに作用する。
例
  =kis
  tolower ABC def;
  # 「abc def」が返る
  
  tolower XYZ XYZ;
  # 「XYZ xyz」が返る
  =end
toupper
Format $(toupper 文字列1 ...)
Return Value 文字列中のアルファベット小文字を大文字に置換した結果
Function 文字列中のアルファベット小文字を大文字に置換する。 半角文字のみに作用する。
例
  =kis
  toupper ABC def;
  # 「ABC DEF」が返る
  
  toupper xyz xyz;
  # 「xyz XYZ」が返る
  =end
tr
Format $(tr 文字列1 置換対象文字 変換文字)
Return Value 置換後の文字列
Function 指定文字列中に置換対象文字のいずれかがあった場合、 対応する変換文字に置き換える。 変換文字に対応する部分がない場合、""に置き換える。 perlのtr//dと同じ動作をする。
例
  =kis
  tr AbCdあいう ABCDABCDabcd abcdwxyz1234;
  # 「aby4あいう」が返る
  =end

4.2.6. コマンド-SAORI

saoriregist
Format $(saoriregist DLLファイル エイリアス [ オプション ] )
Return Value なし
Function

SAORIモジュールの登録。 DLLファイルには、相対パスまたは絶対パスでDLLを指定する。 エイリアスは、callsaoriコマンドでSAORIモジュールを呼ぶ際のキーワードを指定する。

オプションには、SAORIモジュールをロードするタイミングを指定する。 SAORIの中にはロードに時間のかかるものや、 呼ばれない可能性があることも考えられるため、 このような調整が可能となっている。 タイミングには"preload", "loadoncall", "noresident" の3種類があり、 それぞれ、「saoriregist時にロード」「最初にcallsaori(x)された時にロード」 「callsaori時にロードし、終わったら即アンロード」を意味する。 デフォルトはloadoncallである。

例
  =kis
  # saori_cpuid.dllをcpuidとして登録。今すぐロード。
  saoriregist modules\saori_cpuid.dll cpuid preload
  =end
saorierase
Format $(saorierase エイリアス)
Return Value なし
Function 登録済みのSAORIを登録から抹消する。 ロードされていたら併せてアンロードされる。
例
  =kis
  # cpuidをアンロード
  saorierase cpuid;
  =end
saorilist
Format $(saorilist エントリ1)
Return Value なし
Function 登録済みのSAORIのエイリアスを、すべてエントリ1に格納する。 オプションの種類によらず、登録しているエイリアスを全て返すことに注意。
例
  =kis
  # System.SaoriListエントリに登録済SAORIエイリアスの一覧を格納
  saorilist System.SaoriList;
  =end
callsaori
Format callsaori エイリアス [ 引数 引数 ... ]
Return Value SAORIの戻り値(Result)
Function 戻り値が一つのSAORIを呼び出す。
例
  sentence : \0\s[0]ここのOSは$(callsaori cpuid os.name)ね。\e
callsaorix
Format callsaorix エイリアス 戻り値格納エントリ [ 引数 引数 ... ]
Return Value SAORI呼び出し結果(Result)
Function 複数の戻り値を持つSAORIを呼び出し、結果を得る。 SAORIの戻り値はValue[数値]ヘッダに格納されているが、 これを、「指定エントリ.Value[数値]」 エントリに格納する。 また、「指定エントリ.size」 に、得られた戻り値(Value)の数を返す。
例
  # tmizu氏作のwmove.dllを使い、キャラクタの立ち位置を取得する
  =kis
  fuction getposition $(
    # 引数1 : 0=Sakura、1=Kero
    # 引数2 : 戻り値返却用エントリ名
    if $[ $@arg[1] == 0 ] $(
      setstr @characterHWnd $System.HWnd.shell[0];
    ) else if $[ $@arg[1] == 1 ] $(
      setstr @characterHWnd $System.HWnd.shell[1];
    ) else $(
      return "";
    );

    callsaorix wmove $@arg[2] GET_POSITION ${@characterHWnd};
  );
  =end

4.2.7. コマンド-コミュニケート機能

communicate
Format $(communicate エントリ1 単語1)
Return Value エントリ1の示すエントリの単語、もしくは単語1
Function エントリ1の単語を全て評価し、戻り値があった単語をランダムに1個選び、 これをエントリ名と見なしてエントリ呼び出しの結果を返す。 戻り値のあった単語が1つも無い場合、単語1を返す。 単語1は省略可能。
エントリ名の指定には、辞書操作コマンド共通の書式を利用できる。
例
  毒子.keyword1 : うむ , ふはははは , 変態
  毒子.answer1  : \t\0\s[7]胸のことは言うなっ!\e
  毒子.answer1  : \t\0\s[1]…。\e
  
  花ちゃん.keyword1 : どないしたんや , 同じ中学生なのに
  花ちゃん.answer1  : \t\0\s[8]あ‥‥\w8あまりじろじろ見んといてな。\e
  花ちゃん.answer1  : \t\0\s[1]花ちゃんかて…。\e
  
  match_keys : $(
    if $[ ${System.Request.Reference0} == "毒子" ] $(
      if $(xargs 毒子.keyword1 matchall ${System.Request.Reference1})
        毒子.answer1
    )
  )
  
  match_keys : $(
    if $[ ${System.Request.Reference0} == "花ちゃん" ] $(
      if $(xargs 花ちゃん.keyword1 matchall ${System.Request.Reference1})
        花ちゃん.answer1
    )
  )
  
  event.OnCommunicate : $(communicate match_keys ${communicate.else})
  
  # コミュニケートコマンド群を用いたコミュニケートの実装例
  # OnCommunicateイベントでcommunicateコマンドを使い、イベント反応を
  # 記述したmatch_keysエントリを全て評価、戻り値のうち一つを選ぶ
  # そして、戻り値をエントリ名と見なしてエントリ呼び出しを行い、それを返す
  # 何も無い場合、communicate.elseエントリの単語を返す
matchall
Format $(matchall 文字列1 キーワード1 ...)
Return Value 真または偽
Function キーワードが全て文字列1にあった場合、真を返す。 キーワードは1個以上ならば、いくつでも列挙できる。
例
  毒子.keyword1 : あらあら , 最近 , 中学生 , 乳
  
  =kis
  matchall ${System.Request.Reference1} こんにちは;
  # Reference1に「こんにちは」が含まれる場合、真を返す
  
  matchall ${System.Request.Reference1} うにゅう おいしい ?;
  # Reference1に「うにゅう」「おいしい」「?」が含まれる場合、真を返す
  # 例えば「うにゅうっておいしいの?」と言う文章がきた場合、真を返す
  
  xargs 毒子.keyword1 matchall ${System.Request.Reference1};
  # xargsとの合わせ技
  # xargsで毒子.keyword1エントリの単語を「matchall..」以降に列挙
  # 結果として、毒子.keyword1エントリの単語がすべてReference1に含まれる
  # 場合、真を返す
  =end

4.2.8. コマンド-出力

echo
Format $(echo 単語1 ...)
Return Value 全引数を空白文字で接続したもの
Function 与えられた全引数を、空白文字で区切って返す。
例
  =kis
  echo 1 2 3 4 5;
  # 「1 2 3 4 5」が返る
  
  setstr test1 "TEST";
  echo ${test1};
  # 「TEST」が返る
  =end
encode_entryname
Format $(encode_entryname 文字列1)
Return Value エントリ名に使用できる文字に変換した文字列
Function 指定文字列中のエントリ名に使用できない文字を変換し、 エントリ名に使用できる文字列を返す。 使用できない文字は、"_"に変換する。 エントリ名に使用できない文字については、 KIS Programming Reference の「3.華和梨文法」を参照のこと。
例
  =kis
  encode_entryname "「#」や「,」や「 」はエントリ名に使えません";
  # "「_」や「_」や「_」はエントリ名に使えません"が返る。
  =end
escape
Format $(escape 単語1 ...)
Return Value 全引数を空白文字で接続し、「\」を「\\」に、「%」を「\%」に置換したもの
Function 与えられた全引数のさくらスクリプトをエスケープする。
例
  event.OnFileDropped : (
      $(escape ${System.Request.Reference0})
      がドロップされました。)
  # ドラッグ&ドロップされたファイル名を表示する

4.2.9. コマンド-補助機能

entry
Format $(entry エントリ名 単語1)
Return Value ${エントリ名}の結果、または単語1
Function エントリからランダムに単語を選び、評価する。 指定したエントリが空の場合、単語1を返す。 単語1は省略可能。省略した時に指定したエントリが空の場合、 空文字を返す。
evalでも同様のことが可能だが、entryの方が負荷が軽い。
例
  =kis
  entry "npw";
  # ${npw}と同じ
  
  entry "message."$(rand 3);
  # ${message.0}から${message.2}のどれか
  
  entry "system.OtherGhost" ${myname};
  # ${system.OtherGhost}と同じ
  # 空の場合は${myname}の戻り値が返る
  =end
entrycount
Format $(entrycount)
Return Value エントリの総数
Function エントリの総数を返す。主にAIグラフに使用する。
例
  $(entrycount)
eval
Format $(eval 単語1 ...)
Return Value デコード結果
Function 与えられた全引数中の${}、$()等を再度再帰的に評価し、 展開結果を返す。再帰的評価を行う以外はechoと同じ。
例
  kawari     : 華和梨
  nise       : 偽
  shiori     : 栞
  niseshiori : ${nise}${shiori}
  
  =kis
  eval "理夢の偽AIは${kawari}です";
  # 「理夢の偽AIは華和梨です」が返る
  
  eval "奈留の偽AIは${niseshiori}です";
  # 「奈留の偽AIは偽栞です」が返る
  =end

参考
  =kis
  echo "奈留の偽AIは${niseshiori}です";
  # 「奈留の偽AIは${niseshiori}です」が返る
  =end
urllist
Format $(urllist サイト名1 URL1 バナーURL1 ... サイト名n URLn バナーURLn)
Return Value サイト名1[1]URL1[1]バナーURL1[2]...サイト名n[1]URLn[1]バナーURLn[2]
※[1]はバイト値1、[2]はバイト値2
Function SHIORI/2.5規格に従い、「おすすめリスト」を生成する。 引数の数は必ず3の倍数になること。
仕切り線はサイト名に「-」を渡す。
例
  futaba : "http://futaba.mikage.to/"
  kawari : "http://meister-d-i.hoops.ne.jp/"

  # さくら側のおすすめサイトのリスト
  resource.sakura.recommendsites : $(
    urllist "ふたばみかげ" ${futaba} ${futaba}"banner.png"
    "何か以外の何か" ${kawari} ${kawari}"banner.png"
  )

  # うにゅう側のおすすめサイトのリスト
  resource.kero.recommendsites : (
    $(urllist "ふたばみかげ" "http://futaba.mikage.to/" "banner.png")
    $(urllist "-" "-" "-")
    $(urllist "何か以外の何か" "http://meister-d-i.hoops.ne.jp/" "banner.png")
  )
  # サイトごとにurllistコマンドを分けて書くことも出来る
  # 仕切り線の場合でも、ダミーのURLとバナーURLを与える必要がある
wordcount
Format $(wordcount)
Return Value 単語の総数
Function 単語の総数を返す。主にAIグラフに使用する。
例
  $(wordcount)
xargs
Format $(xargs 引数エントリ コマンド1 ...)
Return Value コマンド1の実行結果
Function 引数エントリの内容を添え字順に展開して、コマンド1の引数として与える。 コマンド1の後に書いた引数は、 引数エントリの展開内容より前方に付加する。 コマンド1の実行結果が戻り値となる。
エントリ名の指定には、辞書操作コマンド共通の書式を利用できる。
例
  SaveEntries : HighScore , Life , 喋り頻度 , 好感度 , 最終更新日
  
  RecommendSites : "伺か" , "http://sakura.mikage.to" , "-"
  RecommendSites : "まゆら" , "http://mayura.jp/" , "-"
  RecommendSites : "-" , "-" , "-"
  RecommendSites : "華和梨" , "http://kawari.sf.net/" , "-"
  
  keyword1 : 華和梨 , SHIORI , ゴースト
  
  =kis
  xargs SaveEntries save parameter.txt;
  # SaveEntriesの内容を展開してsaveコマンドを実行。
  # 「save parameter.txt HighScore Lige 喋り頻度 好感度 最終更新日」
  # を実行した場合と等価。
  
  xargs RecommendSites urllist;
  # urllistコマンドにRecommendSitesエントリの内容を展開して与える
  
  xargs keyword1 matchall ${System.Request.Reference0};
  # keyword1エントリの全ての単語がReference0にマッチしたら真を返す
  =end

4.2.10. コマンド-その他

date
Format $(date 書式文字列1 経過秒数1)
Return Value 日時の文字列
Function 経過秒数1を1970/1/1 0:00:00からの経過秒数と考え、 書式文字列1に従って、日時の情報を返す。 経過秒数1は省略可能で、省略すると現時刻を指定したことになる。 書式文字列には以下が使える。
    %d: 日(2桁,01..31)
    %e: 日(1..31)
    %H: 時(2桁,00..23)
    %j: 元日からの通算日(3桁,001..366)
    %J: 元日からの通算日(1..366)
    %k: 時(0..23)
    %m: 月(2桁,01..12)
    %M: 分(2桁,00..59)
    %n: 月(1..12)
    %N: 分(0..59)
    %r: 秒(0..59)
    %S: 秒(2桁,00..59)
    %s: 1970/1/1 00:00:00(協定時)からの通算秒数
    %w: 曜日(0..6,日曜日が0)
    %y: 年(4桁,2000...)
    %Y: 年(4桁,2000...)
'%'で始まるマクロ以外の文字は、そのまま表示する。 また、書式文字列を省略した場合、 「%y/%m/%d %H:%M:%S」をセットした場合と等価である。
例1
  event.OnBoot : $(entry "time."$(date %H) )
  time.01 : 午前一時です\e
  time.02 : 午前二時です\e
  (中略)
  time.23 : 午後十一時です\e
  

例2
  event.OnFirstBoot : $(setstr 1stTime $(date %s) ; entry TalkFirstBoot)
  sentence : (
      \0\s[0]私が最初に起動したのは
      $(date %y ${1stTime})年の
      $(date %n ${1stTime})月
      $(date %e ${1stTime})日で、\w8\w8
      今日で$[ ($(date %s) - ${1stTime}) / (3600 * 24) ]日目です。\e
  )
debugger
Format $(debugger on)
$(debugger off)
Return Value なし
Function 起動中のゴーストに、 幸水からの接続を許すかどうかを決める。 引数に「on」を指定すると、接続可能になる。 「off」を指定すると接続不可になる。 接続可能な場合、 System.Debuggerエントリに「on」という文が定義される。
例
  =kis
  # 幸水にてデバッグ中
  debugger on;
  =end
getenv
Format $(getenv 環境変数名1)
Return Value 環境変数の内容
Function OSの環境変数の内容を返す。 環境変数名1で指定した環境変数の内容を返す。 指定した環境変数がなかった場合、ヌル文字を返す。
例
  $(getenv windir)
  # 環境変数windirが存在する場合、その内容を返す
help
Format $(help コマンド名)
$(help)
Return Value リファレンスまたはコマンド一覧
Function コマンドが指定された場合は、リファレンスを返す。
コマンドが指定されない場合は、使用可能なコマンドの一覧を返す。
戻り値は"幸水"での出力を前提にしている。
例("幸水"での実行例)
  echo-mode > $(help help)
  help
  syntax  : help Command1
  return  : help message
  comment : return online help of KIS commnad (for Kosui use)
  echo-mode > $(help)
  Command list :
          echo
          set
      (・・・中略・・・)
          escape
  echo-mode >
logfile
Format $(logfile ファイル名)
Return Value なし
Function ログを出力するファイルを設定する。 "-"を設定すると標準出力になる(幸水など)。 引数無しにすると、どこにも出力されない(デフォルト)。
例
  =kis
  # 日付付きログファイルを作成
  logfile kawari-$(date %Y%m%d%H%M%S).log;
  
  # ログ禁止
  logfile;
  =end
loglevel
Format $(loglevel キーワードの列挙)
Return Value なし
Function ログに出力する内容を決める。 引数に列挙したキーワードに対応する内容が出力されるようになる。 キーワードには以下がある。 デフォルトではquietだが、 現在、一部のログが設定を無視して出力されてしまう既知のバグあり。
errorエラー
warning警告
info動作情報
decl空エントリへの読み出しアクセス
paranoia上記全て+非常に詳しい動作情報
baseevents基本イベント
timeevents時刻(秒、分)イベント
rsceventsリソース問い合わせイベント
quiet明確にログを禁止する
例
  =kis
  # 通常デバッグ時には、これで十分
  loglevel error warning info baseevents;

  # まぁ、一度ぐらいは試してみてもいいです
  # 間違っても配布版でこれをやらないように
  loglevel paranoia baseevents;
  =end
logprint
Format $(logprint 単語 [ 単語 ... ])
Return Value なし
Function ログに任意の文字列を出力する。 引数に指定された全ての単語をスペースを挟んで連結し、出力する。
例
  =kis
  # いわゆるprintfデバッグ
  logprint ここまで動いた;
  =end
mktime
Format $(mktime 年 月 日 時 分 秒)
Return Value 1970/1/1 0:00:00(協定世界時)から指定時刻までに経過した秒数
Function 1970/1/1 0:00:00(協定世界時)から、引数で指定した時刻までに経過した秒数を返す。 主に戻り値を$(date %s)の第2引数に与える。
例
  =kis
  # 1970/1/1 0:00:00(UTC)から2005/4/1 0:30:25までに経過した秒数を返す
  mktime 2005 4 1 0 30 25;
  
  # 2001/1/25 1:00:00から1000日後の日付を求める
  # 1000日分をmktimeで求めた時刻に足して、dateの第2引数に与えている
  setstr @day $(mktime 2001 1 25 1 0 0);
  date "%y/%m/%d %H:%M:%S" $[ ${@day} + 1000 * 24 * 60 * 60 ];
  =end
rand
Format $(rand 上限)
Return Value 整数の文字列
Function 0から上限の乱数を返す。戻り値は0を含み、上限を含まない。 上限は負の数でもよい。
例
  =kis
  rand 52;
  # 0から51までの乱数を返す
  
  rand -10;
  # 0から-9までの乱数を返す
  =end
rccharset
Format $(rccharset 文字コード名)
Return Value なし
Function 華和梨の出力するエラーメッセージの言語を、文字コードで指定する。 指定する文字列は大文字、小文字を同一視する(case insensitive)。 デフォルトは"ISO-8859-1"(いわゆる半角英文字、ほぼASCII)。 それ以外には、現在の所、"Shift_JIS"だけが使える。 対応していない文字コードを指定するとISO-8859-1になる。
例
  =kis
  # 日本人ならやっぱり?
  rccharset Shift_JIS;
  =end
securitylevel
Format $(securitylevel レベル指定)
Return Value なし
Function セキュリティレベルを指定する。 以下の値を設定できる。
0 / low 全てのイベントを許可する。
1 / middle 外部からやってきたイベントを禁止。
2 / high 当面は1(middle)と同じ。
3 / ultrahigh 明確にローカルマシン発行と記されたイベントのみ許可。
なお、securitylevelコマンドは、ゴースト初期化中のみ、一回だけ実行可能である。
例
  =kis
  # 低レベルに設定
  securitylevel low;
  =end
srand
Format $(srand シード)
Return Value なし
Function 乱数の種を設定する。主にデバッグ目的で使用する。
例
  =kis
  srand 12345678;
  # 乱数の種を「12345678」に設定する
  =end
ver
Format $(ver 情報名)
Return Value バージョン情報
Function "華和梨"の情報を返す。「情報名」で欲しい情報を選択できる。
情報名が「license」の場合、 "華和梨"のライセンス情報をログに出力する。 情報名が「author」の場合、 "華和梨"の開発者情報を返す。 情報名を省略した場合、"華和梨"のバージョン情報を返す。 バージョン情報のフォーマットは「基本名称[.補助名称[.補助名称]]/バージョン番号」。
例("幸水"での実行例)
  echo-mode > $(ver)
  KAWARI.kdt/8.2.0

Appendix

I. インラインスクリプトの追加方法

インラインスクリプトの関数コマンドは、簡単に追加できるよう、華和梨の他の部分と 別のフォルダにソースが収めてあります。srcフォルダ中のkisフォルダがそれです。 自分で"華和梨"を拡張する際、KISの追加だけで望む機能が得られるか、まず検討して 下さい。この場合、華和梨のほかの機能へ与える影響が少なく、無用のエンバグを 避けられます。また、他の人がソースコードを再利用しやすくなるはずです。

KISコマンド追加の基本手順は以下の通りです。

0) ソースを書き換える前に、オリジナルのソースがMakeできるか確認する
1) ソースコードのkis_echo.h/kis_echo.cppをよく読んで、参考にする
2) 拡張するKISコマンドのヘッダファイルを用意する
3) ヘッダファイル名をkis_config.hに追加する
4) cppが増えた場合、必ずファイル名をfiles.makに追加しておく
5) Make

良いKISができたら、ぜひ教えてください。オリジナルの"華和梨"にも採用したいと思います。

II. 注釈

*1 構文コマンドと関数コマンド

構文と関数の、実用上最も重要な違いは、

という点です。引数評価以前は、 引数は「${npw}」や「$(echo Hello)」等の「書いたまま」の状態です。 一方、引数評価以後は、引数は展開されて、 「カルロス・ゴーン」や「Hello」等の「文字列だけ」の状態となります。 引数が通常の文字列だけである場合はさほど問題になりませんが、 引数にsetコマンド等の、 戻り値よりも機能が目的となるコマンドがあった場合、 この差が意味を持つことになります。

  true : 真です。$(set tmp OK)
  # 下記の二つは、表示上は恐らく同じ結果だが…
  $(entry true ${cond})      # true文はcondが不成立でも実行されてしまう。
  $(if ${cond} else ${true}) # true文はcondが不成立なら実行されない。

*2 インラインスクリプトに渡される引数の数

コマンドに引数を与える時、エントリ呼び出しで与える場合を考えます。

  $(echo $(entry ${EntryName}) "Hello")

このケースで、EntryNameエントリに何もセットされていない場合を考えます。 この場合、echoコマンドの第1引数は""で、第2引数が「Hello」になります。 第1引数が「Hello」ということはありません。 インラインスクリプトに渡される引数の数と位置は、エントリ解釈の前に確定します。