Annotation of OpenXM/doc/OpenXM-specs/stackmachine.tex, Revision 1.3
1.1 noro 1: //&jp \section{ OX スタックマシン }
2: //&eg \section{ OX stackmachine } (This section has not yet been translated.)
3:
4: /*&jp
5: この節では, OX スタックマシン operator の説明
6: (TCP/IP ソケット上での標準 encoding 法 を用いる),
7: および, サンプルサーバとリンクする場合または
8: open XM ライブラリとしてリンクして使用する場合の
9: ための C の関数の仕様を説明する.
10:
11: 説明の前に, OX サーバスタックマシンの動作の原則を
12: 説明しておく.
13: サーバスタックマシンは,
14: {\tt SM\_pop*} 系のスタックマシンコマンドがこないかぎり,
15: 自発的にメッセージを送信することはない.
16: この原則に基づいて分散計算のプログラミングをおこなう.
17: イベントドリブンなプログラム法とはちがうことに
18: 注意しよう.
1.2 noro 19: */
1.1 noro 20:
1.2 noro 21: /*&eg
22: In this section we describe the OX stack machine operators. In
23: the descriptions OX messages are represented by th standard encoding
24: scheme on TCP/IP sockets. In principle, an OX stack machine never
25: sends data to the output stream unless it receives {\tt SM\_pop*}
26: commands. Note that the programming style should be different from
27: that for event-driven programming.
28: */
1.1 noro 29:
1.2 noro 30: //&jp \subsection{サーバスタックマシン }
31: //&eg \subsection{Server stack machine}
1.1 noro 32:
1.2 noro 33: /*&jp
1.1 noro 34: サンプルサーバである {\tt oxserver00.c}
35: は以下の仕様の C の関数を用意して,
36: {\tt nullstackmachine.c } を置き換えれば一応動作するはずである.
1.2 noro 37: */
38: /*&eg
39: {\tt oxserver00.c} is implemented as a sample server.
40: If you want to implement you own server,
41: write the following functions and use them instead of
42: those in {\tt nullstackmachine.c }.
43: */
1.1 noro 44:
1.2 noro 45: //&jp \subsubsection{サーバスタックマシンのグループ SMobject/Basic0 に属するオペレータ}
46: //&eg \subsubsection{Operators in the group SMobject/Basic0}
1.1 noro 47:
1.2 noro 48: /*&jp
1.1 noro 49: \noindent
1.2 noro 50: サーバスタックマシンは最低で1本のスタック
51: \begin{verbatim}
52: Object xxx_OperandStack[SIZE];
53: \end{verbatim}
54: をもつ. ここで, {\tt Object} はそのシステム固有の Object 型で構わない.
55: CMObject は各サーバ固有のローカルオブジェクトに変換してスタックへプッ
56: シュしてよい. ただし変換, 逆変換を合成したものは恒等写像であることが
57: のぞましい. CMObject をどのように (local) Object に変換するか, Object
58: が受け付けるメッセージの定義は,各システムが独自にきめて文書化しておく
59: ものとする. つまりすべてのメッセージは, private である. たとえば,
60: {\tt add } のような基本的な メッセージにたいしても, OX スタックマシン
61: はなにもきめていない. 将来的には open math \cite{openmath} のように
62: CMObject に対する最大公約数的なメッセージの仕様をcontent dictionary
63: (CD) の形で定義したい.
64:
65: 以下, \verb+ xxx_ + は誤解の恐れがないときは省略する.
66: \verb+ xxx_ + は local サーバシステムに固有の識別子である.
67: {\tt Asir} の場合は \verb+ Asir_ + を用いる. {\tt kan/sm1} の場合は
68: \verb+ Sm1_ + を用いる. 関数名, タグ名は長いので省略形を用いてもよい.
69:
70: 以下では次のようにパケットを記述する. 各フィールドは,
71: \fbox{データ型 \quad データ} なる形式
72: で書く. たとえば, {\tt int32 OX\_DATA} は 32 bit network byte order
73: の数字 {\tt OX\_DATA}という意味である. ``イタリックで書かれているフィー
74: ルドは,定義が別のところでなされているか解釈に誤解のないような自然言語
75: で説明されている object を表す.'' たとえば, {\it String commandName}
76: は, String データ型の local object {\it commandName} を意味する. (サー
77: バスタックマシン上の object は, CMO 形式の objectとは限らないことに注
78: 意. CMO 形式で書いてあっても, それはサーバスタックマシンのlocal 形式
79: でスタック上にあると解釈して下さい.)
1.1 noro 80:
1.2 noro 81: すべてのサーバスタックマシンは以下の関数を実装していないといけない.
1.3 ! noro 82:
1.2 noro 83: */
1.1 noro 84:
1.2 noro 85: /*&eg
1.1 noro 86: \noindent
1.2 noro 87: Any OX stack machine has at least one stack.
1.1 noro 88: \begin{verbatim}
89: Object xxx_OperandStack[SIZE];
90: \end{verbatim}
1.2 noro 91: Here {\tt Object} may be local to the system {\tt xxx} wrapped by the stack
92: machine.
93: That is, the server may translate CMObjects into local its
94: objects and push them onto the stack. However, it is preferable that
95: the composition of such a translation and its inverse is equal to the
96: identity map. The translation scheme is called the phrase book of the
97: server and it should be documented for each stack machine. In OpenXM,
98: any message is private. In future we will provide a content
99: dictionary (CD; see OpenMath \cite{openmath}) for basic specifications
100: of CMObjects.
101:
102: In the following, \verb+ xxx_ + may be omitted if no confusion occurs.
103: As the names of functions and tags are long, one may use abbreviated
104: names. Message packets are represented as follows. Each field is
105: shown as \fbox{data type \quad data}. For example {\tt int32
106: OX\_DATA} denotes a number {\tt OX\_DATA} which is represented by a 32
107: bit network byte order. If a field is displayed by italic characters,
108: it should be defined elsewhere or its meaning should be clear. For
109: example {\it String commandName} denotes a local object {\it
110: commandName} whose data type is String. Note that an object on the
111: stack may have a local data type even if it is represented as CMO.
1.1 noro 112:
1.2 noro 113: Any server stack machine has to implement the following operations.
114: */
1.1 noro 115:
116: \begin{enumerate}
1.2 noro 117: \item
118: /*&jp
119: CMObject/Basic0 の CMO データのうち必須のもの, {\tt CMO\_ERROR2}, {\tt
120: CMO\_NULL}, {\tt CMO\_INT32}, {\tt CMO\_STRING}, {\tt CMO\_LIST}がおく
121: られて来た場合それをスタックに push する. たとえば, {\tt CMO\_NULL}
122: あるいは {\tt CMO\_String} の場合次のようになる.
123: */
124: /*&eg
125: Any server should accept CMObjects in the group CMObject/Basic0.
126: The server pushes such data onto the stack.
127: The following examples show the states of the stack after receiving
128: {\tt CMO\_NULL} or {\tt CMO\_String} respectively.
129: */
1.1 noro 130:
1.2 noro 131: Request:
1.1 noro 132: \begin{tabular}{|c|c|} \hline
133: {\tt int32 OX\_DATA} & {\tt int32 CMO\_NULL} \\
134: \hline
135: \end{tabular}
1.2 noro 136:
137: Stack after the request:
1.1 noro 138: \begin{tabular}{|c|} \hline
139: {\it NULL} \\
140: \hline
141: \end{tabular}
142:
1.3 ! noro 143: Result: none.
1.2 noro 144:
145: Request:
1.1 noro 146: \begin{tabular}{|c|c|c|c|c|c|} \hline
147: {\tt int32 OX\_DATA} & {\tt int32 CMO\_String} &{\tt int32} {\rm size}
148: &{\tt byte} {\rm s1} & $\cdots$ &{\tt byte} {\rm ssize}\\
149: \hline
150: \end{tabular}
1.2 noro 151:
152: Stack after the request:
1.1 noro 153: \begin{tabular}{|c|} \hline
154: {\it String s} \\
155: \hline
156: \end{tabular}
157:
1.3 ! noro 158: Result: none.
1.2 noro 159:
160: //&jp CMO データの受け取りに失敗した時のみ \\
161: //&eg If the server fails to receive a CMO data,
1.1 noro 162: \begin{tabular}{|c|c|c|} \hline
163: {\tt int32 OX\_DATA} & {\tt int32 CMO\_ERROR2} & {\it CMObject} ob\\
164: \hline
165: \end{tabular}
166: \\
1.2 noro 167: /*&jp
1.1 noro 168: をスタックへ push する.
169: 現在のところ, ob には, \\
170: \centerline{
171: [{\sl Integer32} OX パケット番号, {\sl Integer32} エラー番号,
172: {\sl CMObject} optional 情報]
173: }
174: なるリストを入れる (CMO 形式でかいてあるが, これはサーバ独自の形式でよい.
175: CMO として送出されるときこのような形式でないといけないという意味である.)
1.2 noro 176: */
177: /*&eg
178: is pushed onto the stack.
179: Currently ob is a list\\
180: \centerline{
181: [{\sl Integer32} OX serial number, {\sl Integer32} error code,
182: {\sl CMObject} optional information]
183: }
184: */
1.1 noro 185:
186: \item
187: \begin{verbatim}
1.2 noro 188: SM_mathcap
1.1 noro 189: \end{verbatim}
1.2 noro 190: /*&jp
191: このサーバの mathcap をもどす (termcap のまね). サーバのタイプ, サー
192: バスタックマシンの能力を知ることができる. C 言語で実装する場合は,
193: mathCap の構造体をシステム毎にきめるものとし,この関数はその構造体への
194: ポインタを戻す. (open sm1 では {\tt struct mathCap} を用いている.
195: */
196: /*&eg
1.3 ! noro 197: It requests a server to push the mathcap of the server.
1.2 noro 198: The mathcap is similar to the termcap. One can know the server type
199: and the capability of the server from the mathcap.
200: */
1.1 noro 201: @plugin/mathcap.h)
1.2 noro 202:
203: Request:
1.1 noro 204: \begin{tabular}{|c|c|} \hline
205: {\tt int32 OX\_COMMAND} & {\tt int32 SM\_mathcap} \\
206: \hline
207: \end{tabular}
1.2 noro 208:
1.3 ! noro 209: Stack after the request:
1.1 noro 210: \begin{tabular}{|c|c|} \hline
211: {\tt int32 OX\_DATA} & {\sl Mathcap} mathCapOb \\
212: \hline
213: \end{tabular}
214:
1.3 ! noro 215: Result: none.
! 216:
1.1 noro 217: \item
218: \begin{verbatim}
1.2 noro 219: SM_setMathCap
1.1 noro 220: \end{verbatim}
1.2 noro 221: /*&jp
222: 受け取った Mathcap {\tt m} を自分のシステムに設定して, 相手側が理解不
223: 能な CMO をおくらないようにする. C 言語で実装する場合は, mathCap の構
224: 造体をシステム毎にきめるものとし,この関数はその構造体へのポインタを引
225: 数とする. (open sm1 では {\tt struct mathCap} を用いている.
226: */
227: /*&eg
1.3 ! noro 228: It requests a server to register the peer's mathcap {\tt m} in the server.
1.2 noro 229: The server can avoid to send OX messages unknown to its peer.
230: */
1.1 noro 231: @plugin/mathcap.h)
1.2 noro 232:
233: Request:
1.1 noro 234: \begin{tabular}{|c|c|} \hline
235: {\tt int32 OX\_DATA} & {\sl Mathcap} m \\ \hline
236: {\tt int32 OX\_COMMAND} & {\tt int32 SM\_setMathCap} \\
237: \hline
238: \end{tabular}
1.2 noro 239:
1.3 ! noro 240: Result: none.
1.2 noro 241: /*&jp
242: \noindent
1.1 noro 243: 注意: mathcap は一般にクライアント主体で設定する.
244: クライアントがサーバに {\tt SM\_mathcap} をおくり,
245: サーバ側の mathcap を得る.
246: それを, クライアントはそのサーバに付随した mathcap として
247: 設定する.
248: 次に, クライアントはサーバに自分の mathcap を
249: {\tt SM\_setMathCap} でおくり, 自分の mathcap を設定させる.
1.2 noro 250: */
251: /*&eg
252: \noindent
253: Remark: In general the exchange of mathcaps is triggered by a client.
254: A client sends {\tt SM\_mathcap} to a server and obtains the server's
255: mathcap. Then the client registers the mathcap. Finally the client
256: sends its own mathcap by {\tt SM\_setMathCap} and the server
257: registers it.
258: */
1.1 noro 259:
260: \item
261: \begin{verbatim}
1.2 noro 262: SM_executeStringByLocalParser
1.1 noro 263: \end{verbatim}
1.2 noro 264: /*&jp
1.3 ! noro 265: 文字列 {\tt s} を stack から pop し,
! 266: その文字列をシステム固有の文法(サーバスタックマシンの組み込みローカ
! 267: ル言語)にしたがったコマンドとして実行する. コマンドの実行の結
1.2 noro 268: 果の最後に戻り値があるときは, {\tt OperandStack} に戻り値を push する.
1.3 ! noro 269: OpenXM では, 現在のところ関数名の標準化はおこなっていない.
1.2 noro 270: この関数および {\tt popString} の機能を実現すれば, 最低限の open XM の
271: サーバになれる. 実装では, まずこの二つの関数の機能を実現すべきである.
272: */
273: /*&eg
1.3 ! noro 274: It requests a server to pop a character string {\tt s}, to
! 275: parse it by the local parser of the stack machine, and
! 276: to interprete by the local interpreter.
1.2 noro 277: If the exececution produces a result, it is pushed onto
278: {\tt OperandStack}.
279: If an error has occured, Error2 Object is pushed onto the stack.
280: OpenXM does not provide standard function names.
281: If this operation and {\tt SM\_popString} is implemented, the stack machine
282: can be used as an OX server.
283: */
284:
285: Stack before the request:
1.1 noro 286: \\
287: \begin{tabular}{|c|} \hline
288: {\it String commandString} \\
289: \hline
290: \end{tabular}
1.2 noro 291:
292: Request:
1.1 noro 293: \begin{tabular}{|c|c|} \hline
294: {\tt int32 OX\_COMMAND}& {\tt int32 SM\_executeStringByLocalParser} \\
295: \hline
296: \end{tabular}
1.2 noro 297:
1.3 ! noro 298: Result: none.
1.2 noro 299: /*&jp
300: \noindent
301: 参考: \ 実行前のスタックのデータは,
302: {\it String commandString} なる local stackmachine の object としてス
303: タック上にあるが, TCP/IP の通信路では, 次のようなデータがまずながれて
1.1 noro 304: {\it commandName} がスタックに push される:
1.2 noro 305: */
306: /*&eg
307: \noindent
308: Remark: Before this request, one has to push {\it String commandString}
309: onto the stack. It is done by sending the following OX data message.
310: */
1.1 noro 311: \begin{tabular}{|c|c|c|} \hline
312: {\tt int32 OX\_DATA} & {\tt int32 CMO\_string} & {\it size and the string commandString} \\
313: \hline
314: \end{tabular}
315:
316: \item
317: \begin{verbatim}
1.2 noro 318: SM_executeStringByLocalParserInBatchMode
1.1 noro 319: \end{verbatim}
1.2 noro 320: /*&jp
321: スタックに副作用がない(スタックにたいしてなんの操作もしない)ことを除き
322: 上とまったく同じ関数である. エラーの時のみ, Error2 Object をスタック
323: へプッシュする.
324: */
325: /*&eg
326: This is the same request as {\tt SM\_executeStringByLocalParser}
327: except that it does not modify the stack. It pushes an Error2 Object
328: if an error has occured.
329: */
1.1 noro 330: \item
331: \begin{verbatim}
1.2 noro 332: SM_popString
333: \end{verbatim}
334: /*&jp
335: {\tt OperandStack} より Object を pop し, それを xxx の出力規則にしたがい文
336: 字列型に変換して送信する. スタックが空のときは, {\tt (char *)NULL} を戻す.
1.3 ! noro 337: 文字列は TCP/IP stream へ CMO のデー
1.2 noro 338: タとして送信する. エラーの場合は {\tt CMO\_ERROR2} を戻すべきである.
339: */
340: /*&eg
1.3 ! noro 341: It requests a server to pop an object from {\tt OperandStack},
1.2 noro 342: to convert it into a character string according to the output format
343: of the local system, and to send the character string via TCP/IP stream.
344: {\tt (char *)NULL} is returned when the stack is empty.
345: The returned strings is sent as a CMO string data.
346: {\tt CMO\_ERROR2} should be returned if an error has occured.
347: */
348:
349: Stack before the request:
1.1 noro 350: \begin{tabular}{|c|} \hline
351: {\it Object} \\
352: \hline
353: \end{tabular}
1.2 noro 354:
355: Request:
1.1 noro 356: \begin{tabular}{|c|c|} \hline
357: {\tt int32 OX\_COMMAND} & {\tt int32 SM\_popString} \\
358: \hline
359: \end{tabular}
1.2 noro 360:
361: Result:
1.1 noro 362: \begin{tabular}{|c|c|c|} \hline
363: {\tt int32 OX\_DATA} & {\tt int32 CMO\_STRING} & {\it size and the string s} \\
364: \hline
365: \end{tabular}
366:
367: \item
368: \begin{verbatim}
1.2 noro 369: SM_getsp
1.1 noro 370: \end{verbatim}
1.2 noro 371: /*&jp
372: 現在のスタックポインタの位置をもどす. スタート時点での位置は 0 であり,
373: object が push されたばあい, 1 づつ増えるものとする.
374: */
375: /*&eg
1.3 ! noro 376: It requests a server to push the current stack pointer onto the stack.
1.2 noro 377: The stack pointer is represented by a non-negative integer.
378: Its initial value is 0 and a push operation increments the
379: stack pointer by 1.
380: */
381:
382: Stack before the request:
1.1 noro 383: \begin{tabular}{|c|} \hline
384: {\it Object} \\
385: \hline
386: \end{tabular}
1.2 noro 387:
388: Request:
1.1 noro 389: \begin{tabular}{|c|c|} \hline
390: {\tt int32 OX\_COMMAND} & {\tt int32 SM\_getsp} \\
391: \hline
392: \end{tabular}
1.2 noro 393:
1.3 ! noro 394: Stack after the request:
1.1 noro 395: \begin{tabular}{|c|c|c|} \hline
396: {\tt int32 OX\_DATA} & {\tt int32 CMO\_INT32} & {\it stack pointer value} \\
397: \hline
398: \end{tabular}
399:
1.3 ! noro 400: Result: none.
! 401:
1.1 noro 402: \item
403: \begin{verbatim}
1.2 noro 404: SM_dupErrors
1.1 noro 405: \end{verbatim}
1.2 noro 406: /*&jp
407: スタック上のエラーオブジェクトをリストにして戻す. スタック自体は変化
408: させない.
409: */
410: /*&eg
1.3 ! noro 411: It requests a server to push a list object containing all error objects on the stack.
1.2 noro 412: */
413:
414: Stack before the request:
1.1 noro 415: \begin{tabular}{|c|} \hline
416: {\it Object} \\
417: \hline
418: \end{tabular}
1.2 noro 419:
420: Request:
1.1 noro 421: \begin{tabular}{|c|c|} \hline
422: {\tt int32 OX\_COMMAND} & {\tt int32 SM\_dupErrors} \\
423: \hline
424: \end{tabular}
1.2 noro 425:
1.3 ! noro 426: Stack after the request:
1.1 noro 427: \begin{tabular}{|c|c|c|} \hline
428: {\tt int32 OX\_DATA} & {\sl CMObject} \ a list of errors\\
429: \hline
430: \end{tabular}
1.3 ! noro 431:
! 432: Result: none.
1.1 noro 433: \end{enumerate}
434:
435: \medbreak
436: \noindent
1.2 noro 437: /*&jp
1.1 noro 438: {\bf 例}: \
439: mathcap の問い合わせに対して, {\tt ox\_sm1} は次のように答える.
1.2 noro 440: */
441: /*&eg
442: {\bf Example}: \
443: {\tt ox\_sm1} returns the following data as its mathcap.
444: */
1.1 noro 445: %%Prog: [(cmoMathCap)] extension ::
446: \begin{verbatim}
447: Class.mathcap
448: [ [199909080 , $Ox_system=ox_sm1.plain$ , $Version=2.990911$ ,
449: $HOSTTYPE=i386$ ] ,
450: [262 , 263 , 264 , 265 , 266 , 268 , 269 , 272 , 273 , 275 , 276 ] ,
451: [[514] , [2130706434 , 1 , 2 , 4 , 5 , 17 , 19 , 20 , 22 , 23 , 24 ,
452: 25 , 26 , 30 , 31 , 60 , 61 , 27 , 33 , 40 , 34 ]]]
453: \end{verbatim}
454:
1.2 noro 455: /*&jp
456: mathcap は 3つの要素をもつリストである. まづ, 最初の要素を見よう.
457: Ox\_system は open xxx システム名である. 読み込むライブラリがちがって
458: いて, 関数名(または シンボル)の意味がちがうときはこの名前もかえる. た
459: とえば, open math の basic content dictionary 対応の関数定義マクロを読
460: みこんだ sm1 は, ox\_sm1\_basicCD なる名前にする. HOSTTYPE値は, CPU
461: の種類をあらわしunix では環境変数\verb+$HOSTTYPE+ の値である. 2 番目
462: の要素は 利用可能な SM コマンドをあつめたリストである. 3 番目のリスト
463: は, 処理可能な数学データの形式, およびCMOの場合なら処理可能なCMOのタグ
464: のリストが続く. 上の例では, 514 は {\tt OX\_DATA} をあらわし, 数学デー
465: タのフォマットは(サイズ情報なしの) CMO であることを示す.
466: */
467: /*&eg
468: A mathcap has three components. The first one contains informations
469: to identify the system and hosts on which the application runs.
470: In the above example, Ox\_system denotes the system name.
471: HOSTTYPE represents the OS type and taken from \verb+$HOSTTYPE+
472: enviroment variable.
473: The second component consists of avaiable SM commands.
474: The third component is a list of pairs. Each pair consists
475: of an OX message tag and the available message tags.
476: Again in the above example, 514 is the value of {\tt OX\_DATA}
477: and it indicates that the server accepts CMO (without size information)
478: as mathematical data messages. In this case the subsequent
479: list represents available CMO tags.
480: */
1.1 noro 481:
482: \medbreak
483: \noindent
1.2 noro 484: //&jp {\bf 例}: \
485: //&eg {\bf Example}: \
1.1 noro 486: %%Prog: (ox.sm1) run sm1connectr [(oxWatch) ox.ccc] extension
487: %%Prog: ox.ccc (122345; ) oxsubmit ;
1.2 noro 488: //&jp {\tt message\_body} の実例をあげる. シリアル番号部は除いてある.
1.3 ! noro 489: //&eg We show examples of {\tt message\_body}. Serial numbers are omitted.
1.1 noro 490: \begin{enumerate}
491: \item {\tt executeStringByLocalParser("12345 ;");}
1.2 noro 492: /*&jp
493: は次のようなパケットに変換される. 各数字は 16進1バイトをあらわす.
494: {\tt xx(yy)} のなかの {\tt (yy)} は対応するアスキーコードをあわらす.
495: */
496: /*&eg
1.3 ! noro 497: is converted into the following packet. Each number denotes
! 498: one byte in hexadecimal representation.
! 499: {\tt (yy)} in {\tt xx(yy)} represents the corresponding ASCII code.
1.2 noro 500: */
1.1 noro 501: \begin{verbatim}
502: 0 0 2 2 0 0 0 4 0 0 0 7
503: 31(1) 32(2) 33(3) 34(4) 35(5) 20 3b(;)
504: 0 0 2 1 0 0 1 c
505: \end{verbatim}
1.2 noro 506: /*&jp
1.3 ! noro 507: それぞれのデータの意味は次のとおりである.
! 508: */
! 509: /*&eg
! 510: Each data has the following meaning.
1.2 noro 511: */
1.1 noro 512:
513: \begin{verbatim}
514: 0 0 2 2 (OX_DATA) 0 0 0 4 (CMO_STRING)
515: 0 0 0 7 (size)
516: 31(1) 32(2) 33(3) 34(4) 35(5) 20 3b(;) (data)
517: 0 0 2 1 (OX_COMMAND)
518: 0 0 1 c (SM_executeStringByLocalParser)
519: \end{verbatim}
1.2 noro 520: //&jp これを OXexpression で表記すると次のようになる.
1.3 ! noro 521: //&eg This is expressed by OXexpression as follows.
1.1 noro 522: \begin{center}
523: (OX\_DATA, (CMO\_STRING, 7, "12345 ;"))
524: \end{center}
525: \begin{center}
526: (OX\_COMMAND, (SM\_executeStringByLocalParser))
527: \end{center}
528:
1.2 noro 529: //&jp \item {\tt popString()} を要請するメッセージ:
1.3 ! noro 530: //&eg \item A message which requests {\tt SM\_popString}:
1.1 noro 531: \begin{verbatim}
532: 0 0 2 1 (OX_COMMAND)
533: 0 0 1 7 (SM_popString)
534: \end{verbatim}
1.3 ! noro 535: //&jp OXexpression では
! 536: //&eg In OXexpression it is represented as
1.1 noro 537: (OX\_COMMAND, (SM\_popString)).
538:
539: \noindent
1.2 noro 540: //&jp これにたいして次の返答メッセージがくる.
1.3 ! noro 541: //&eg The server returns the following reply message:
1.1 noro 542: \begin{verbatim}
543: 0 0 2 2 (OX_DATA)
544: 0 0 0 4 (CMO_STRING) 0 0 0 5 (size)
545: 31(1) 32(2) 33(3) 34(4) 35(5)
546: \end{verbatim}
1.2 noro 547: //&jp OXexpression でかくと,
1.3 ! noro 548: //&eg In OXexpression it is represented as
1.1 noro 549: (OX\_DATA, (CMO\_STRING, 7, "12345 ;")).
550: \end{enumerate}
551:
1.2 noro 552: //&jp \subsubsection{グループ SMobject/Basic1 に属するオペレータ}
1.3 ! noro 553: //&eg \subsubsection{Operators in the group SMobject/Basic1}
1.1 noro 554:
555: \begin{enumerate}
556: \item
557: \begin{verbatim}
1.3 ! noro 558: SM_pops
1.1 noro 559: \end{verbatim}
1.2 noro 560: /*&jp
561: operand stack より, {\it n} 個の元 ({\it obj1, obj2, $\ldots$, objn})
562: を pop して捨てる.
563: */
564: /*&eg
1.3 ! noro 565: It requests a server to pop {\it n} and to discard elements {\it obj1, obj2,
! 566: $\ldots$, objn}) from the stack.
1.2 noro 567: */
568:
569: //&jp Stack before the request: (右が stack のトップである.) \\
1.3 ! noro 570: //&eg Stack before the request: (The rightmost one is the top of the stack.) \\
1.1 noro 571: \begin{tabular}{|c|c|c|c|c|} \hline
572: {\it obj1} & {\it obj2} & $\cdots$ & {\it objn} &{\it INT32 n} \\
573: \hline
574: \end{tabular}
1.2 noro 575:
576: Request:
1.1 noro 577: \begin{tabular}{|c|c|} \hline
578: {\tt int32 OX\_COMMAND} & {\tt int32 SM\_pops } \\
579: \hline
580: \end{tabular}
1.2 noro 581:
1.3 ! noro 582: Result: none.
1.1 noro 583:
584:
585: \item
586: \begin{verbatim}
1.3 ! noro 587: int SM_setName
1.1 noro 588: \end{verbatim}
1.2 noro 589: /*&jp
590: {\tt OperandStack} より {\it name} を pop し, つぎに{\tt OperandStack}
591: より {\it obj} を pop し, それを現在の名前空間で変数 {\it name} に
592: bind する. 正常終了なら 0 を, 異常終了なら -1 をもどす. TCP/IP によ
593: る通信では, 異常終了の時のみ, {\tt CMO\_ERROR2} をstack へ push する.
594: */
595: /*&eg
1.3 ! noro 596: It requests a server to pop {\it name}, to pop {\it obj}, and to
! 597: bind {\it obj} to a variable {\it name} in the current name space.
! 598: If an error has occured {\tt CMO\_ERROR2} is pushed to the stack.
1.2 noro 599: */
600: //&jp Stack before the request: (右が stack の top.)
1.3 ! noro 601: //&eg Stack before the request: (The rightmost one is the top of the stack.)
1.1 noro 602: \begin{tabular}{|c|c|} \hline
603: {\it obj} & {\it String name} \\
604: \hline
605: \end{tabular}
1.2 noro 606:
607: Request:
1.1 noro 608: \begin{tabular}{|c|c|} \hline
609: {\tt int32 OX\_COMMAND} & {\tt int32 SM\_setName} \\
610: \hline
611: \end{tabular}
1.2 noro 612:
1.3 ! noro 613: Result: none.
1.1 noro 614:
615: \item
616: \begin{verbatim}
1.3 ! noro 617: SM_evalName
1.1 noro 618: \end{verbatim}
1.3 ! noro 619:
1.2 noro 620: /*&jp
621: 現在の名前空間で変数 {\it name} を評価する. 評価の結果 {\it
622: resultObj} をスタックへ戻す. 関数自体は正常終了なら 0 を, 異常終了な
623: ら -1 をもどす. TCP/IP の場合, 異常終了の場合のみ {\tt CMO\_ERROR2}
624: を stack へ push する.
625: */
1.3 ! noro 626:
1.2 noro 627: /*&eg
1.3 ! noro 628: It requests a server to pop {\it name} and to evaluate a variable
! 629: {\it name} in the current name space. The result of the evaluation
! 630: {\it resultObj} is pushed to the stack.
! 631: If an error has occured {\tt CMO\_ERROR2} is pushed to the stack.
1.2 noro 632: */
633:
634: //&jp Stack before the request: (右が stack の top.)
1.3 ! noro 635: //&eg Stack before the request: (The rightmost one is the top of the stack.)
1.1 noro 636: \begin{tabular}{|c|} \hline
637: {\it String name} \\
638: \hline
639: \end{tabular}
1.2 noro 640:
641: Request:
1.1 noro 642: \begin{tabular}{|c|c|} \hline
643: {\tt int32 OX\_COMMAND} & {\tt int32 SM\_evalName} \\
644: \hline
645: \end{tabular}
1.2 noro 646:
647: //&jp Stack after the request: (右が stack の top.)
1.3 ! noro 648: //&eg Stack after the request: (The rightmost one is the top of the stack.)
1.1 noro 649: \begin{tabular}{|c|} \hline
650: {\it resultObj} \\
651: \hline
652: \end{tabular}
1.2 noro 653:
1.3 ! noro 654: Result: none.
1.1 noro 655:
656: \item
657: \begin{verbatim}
1.3 ! noro 658: SM_executeFunction
1.1 noro 659: \end{verbatim}
1.2 noro 660: /*&jp
661: スタックより {\it n} 個のデータを pop して, サーバのローカル関数{\it
662: s} を実行する. エラーのときのみ {\tt CMO\_ERROR2} を stack へ push す
663: る.
664: */
665: /*&eg
1.3 ! noro 666: It requests a server to pop {\it s} as a function name,
! 667: to pop {\it n} as the number of arguments and to execute
! 668: a local function {\it s} with {\it n} arguments popped from
! 669: the stack.
! 670: If an error has occured {\tt CMO\_ERROR2} is pushed to the stack.
1.2 noro 671: */
672:
673: //&jp Stack before the request: (右が stack の top.) \\
674: //&eg Stack before the request: (右が stack の top.) \\
1.1 noro 675: \begin{tabular}{|c|c|c|c|c|} \hline
676: {\it objn} & $\cdots$ & {\it obj1} & {\it INT32 n} & {\it String s} \\
677: \hline
678: \end{tabular}
1.2 noro 679:
680: Request:
1.1 noro 681: \begin{tabular}{|c|c|} \hline
682: {\tt int32 OX\_COMMAND} & {\tt int32 SM\_executeFunction} \\
683: \hline
684: \end{tabular}
685:
1.2 noro 686: //&jp Stack after the request: 関数実行の結果.
1.3 ! noro 687: //&eg Stack after the request: The result of the execution.
1.1 noro 688:
1.3 ! noro 689: Result: none.
1.1 noro 690:
691: \item
692: \begin{verbatim}
1.3 ! noro 693: SM_popSerializedLocalObject
1.1 noro 694: \end{verbatim}
1.3 ! noro 695:
1.2 noro 696: /*&jp
1.3 ! noro 697: スタックより pop した object を local 形式で serialization して
! 698: OX message として stream へ出力する. OX message tag としては,
! 699: local 形式に対応したものが定義されていることが必要である.
! 700: この関数はおもに, homogeneous な分散システムで用いる.
1.2 noro 701: */
702: /*&eg
1.3 ! noro 703: It requests a sever to pop an object, to convert it into a
! 704: serialized form according to a local serialization scheme, and
! 705: to send it to the stream as an OX message.
! 706: An OX message tag corresponding to
! 707: the local data format must be sent prior to the serialized data
! 708: itself.
! 709: This operation is used mainly on homogeneous distributed systems.
1.2 noro 710: */
1.1 noro 711:
712: \item
713: \begin{verbatim}
1.3 ! noro 714: SM_popCMO
1.1 noro 715: \end{verbatim}
716:
1.2 noro 717: /*&jp
1.3 ! noro 718: {\tt OperandStack} より object を pop し CMO 形式の serialized object を
! 719: stream へ header {\tt OX\_DATA} をつけてながす.
1.2 noro 720: */
721: /*&eg
1.3 ! noro 722: It requests a server to pop an object from the stack, to convert
! 723: it into a serialized form according to the standard CMO encoding scheme,
! 724: and to send it to the stream with the {\tt OX\_DATA} header.
1.2 noro 725: */
726:
727: Request:
1.1 noro 728: \begin{tabular}{|c|c|} \hline
729: {\tt int32 OX\_COMMAND} & {\tt int32 OX\_popCMO} \\
730: \hline
731: \end{tabular}
1.2 noro 732:
733: Result:
1.1 noro 734: \begin{tabular}{|c|c|} \hline
735: {\tt int32 OX\_DATA} & {\it Serialized CMO} \\
736: \hline
737: \end{tabular}
738:
739: \end{enumerate}
740:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>