root/NEWT0/trunk/src/newt_core/NewtFns.c

Revision 113, 46.2 kB (checked in by gnue, 17 months ago)

'#pragma mark' is invalidated by '#if 0'

Line 
1/*------------------------------------------------------------------------*/
2/**
3 * @file    NewtFns.c
4 * @brief   組込み関数
5 *
6 * @author  M.Nukui
7 * @date    2003-11-07
8 *
9 * Copyright (C) 2003-2004 M.Nukui All rights reserved.
10 */
11
12
13/* ヘッダファイル */
14#include <string.h>
15
16#include "NewtErrs.h"
17#include "NewtFns.h"
18#include "NewtEnv.h"
19#include "NewtObj.h"
20#include "NewtVM.h"
21#include "NewtBC.h"
22#include "NewtPrint.h"
23
24
25/* 関数プロトタイプ */
26static newtRef      NewtRefTypeToClass(uint16_t type);
27static newtRef      NewtObjClassOf(newtRefArg r);
28static newtRef      NewtObjSetClass(newtRefArg r, newtRefArg c);
29static bool         NewtArgsIsNumber(newtRefArg r1, newtRefArg r2, bool * real);
30
31
32#if 0
33#pragma mark -
34#endif
35/*------------------------------------------------------------------------*/
36/** プロト継承でシンボルを検索(フレームを見つける)
37 *
38 * @param start     [in] 開始オブジェクト
39 * @param name      [in] シンボルオブジェクト
40 *
41 * @return          検索されたオブジェクトを持つフレーム
42 */
43
44newtRef NcProtoLookupFrame(newtRefArg start, newtRefArg name)
45{
46    newtRefVar  current = start;
47
48    while (NewtRefIsNotNIL(current))
49    {
50        current = NcResolveMagicPointer(current);
51
52        if (NewtRefIsMagicPointer(current))
53            return kNewtRefUnbind;
54
55        if (NewtHasSlot(current, name))
56            return current;
57
58        current = NcGetSlot(current, NSSYM0(_proto));
59    }
60
61    return kNewtRefUnbind;
62}
63
64
65/*------------------------------------------------------------------------*/
66/** プロト継承でシンボルを検索
67 *
68 * @param start     [in] 開始オブジェクト
69 * @param name      [in] シンボルオブジェクト
70 *
71 * @return          検索されたオブジェクト
72 */
73
74newtRef NcProtoLookup(newtRefArg start, newtRefArg name)
75{
76    newtRefVar  current;
77
78    current = NcProtoLookupFrame(start, name);
79
80    if (current != kNewtRefUnbind)
81        return NcGetSlot(current, name);
82    else
83        return kNewtRefUnbind;
84}
85
86
87/*------------------------------------------------------------------------*/
88/** レキシカルスコープでシンボルを検索
89 *
90 * @param start     [in] 開始オブジェクト
91 * @param name      [in] シンボルオブジェクト
92 *
93 * @return          検索されたオブジェクト
94 */
95
96newtRef NcLexicalLookup(newtRefArg start, newtRef name)
97{
98    newtRefVar  current = start;
99
100    while (NewtRefIsNotNIL(current))
101    {
102        current = NcResolveMagicPointer(current);
103
104        if (NewtRefIsMagicPointer(current))
105            return kNewtRefUnbind;
106
107        if (NewtHasSlot(current, name))
108            return NcGetSlot(current, name);
109
110        current = NcGetSlot(current, NSSYM0(_nextArgFrame));
111    }
112
113    return kNewtRefUnbind;
114}
115
116
117/*------------------------------------------------------------------------*/
118/** プロト、ペアレント継承でシンボルを検索(フレームを見つける)
119 *
120 * @param start     [in] 開始オブジェクト
121 * @param name      [in] シンボルオブジェクト
122 *
123 * @return          検索されたオブジェクトを持つフレーム
124 */
125
126newtRef NcFullLookupFrame(newtRefArg start, newtRefArg name)
127{
128    newtRefVar  current;
129    newtRefVar  left = start;
130
131    if (! NewtRefIsFrame(start))
132        return kNewtRefUnbind;
133
134    while (NewtRefIsNotNIL(left))
135    {
136        current = left;
137
138        while (NewtRefIsNotNIL(current))
139        {
140            current = NcResolveMagicPointer(current);
141
142            if (NewtRefIsMagicPointer(current))
143                return kNewtRefUnbind;
144
145            if (NewtHasSlot(current, name))
146                return current;
147   
148            current = NcGetSlot(current, NSSYM0(_proto));
149        }
150
151        left = NcGetSlot(left, NSSYM0(_parent));
152    }
153
154    return kNewtRefUnbind;
155}
156
157
158/*------------------------------------------------------------------------*/
159/** プロト、ペアレント継承でシンボルを検索
160 *
161 * @param start     [in] 開始オブジェクト
162 * @param name      [in] シンボルオブジェクト
163 *
164 * @return          検索されたオブジェクト
165 */
166
167newtRef NcFullLookup(newtRefArg start, newtRefArg name)
168{
169    newtRefVar  current;
170
171    current = NcFullLookupFrame(start, name);
172
173    if (current != kNewtRefUnbind)
174        return NcGetSlot(current, name);
175    else
176        return kNewtRefUnbind;
177}
178
179
180#if 0
181#pragma mark -
182#endif
183/*------------------------------------------------------------------------*/
184/** シンボルテーブルからシンボルを検索
185 *
186 * @param r         [in] シンボルテーブル
187 * @param name      [in] シンボル名
188 *
189 * @return          検索されたシンボルオブジェクト
190 */
191
192newtRef NcLookupSymbol(newtRefArg r, newtRefArg name)
193{
194    return NewtLookupSymbolArray(r, name, 0);
195}
196
197
198/*------------------------------------------------------------------------*/
199/** 例外を発生
200 *
201 * @param rcvr      [in] レシーバ
202 * @param name      [in] 例外シンボル
203 * @param data      [in] 例外データ
204 *
205 * @retval          NIL
206 *
207 * @note            スクリプトからの呼出し用
208 */
209
210newtRef NsThrow(newtRefArg rcvr, newtRefArg name, newtRefArg data)
211{
212    NVMThrow(name, data);
213    return kNewtRefNIL;
214}
215
216
217/*------------------------------------------------------------------------*/
218/** rethrow する
219 *
220 * @param rcvr      [in] レシーバ
221 *
222 * @retval          NIL
223 *
224 * @note            スクリプトからの呼出し用
225 */
226
227newtRef NsRethrow(newtRefArg rcvr)
228{
229    NVMRethrow();
230    return kNewtRefNIL;
231}
232
233
234/*------------------------------------------------------------------------*/
235/** オブジェクトをクローン複製する
236 *
237 * @param r         [in] オブジェクト
238 *
239 * @return          クローン複製されたオブジェクト
240 */
241
242newtRef NcClone(newtRefArg r)
243{
244    if (NewtRefIsPointer(r))
245        return NewtObjClone(r);
246    else
247        return (newtRef)r;
248}
249
250
251/*------------------------------------------------------------------------*/
252/** オブジェクトの深いクローン複製をする(マジックポインタは追跡しない)
253 *
254 * @param rcvr      [in] レシーバ
255 * @param r         [in] オブジェクト
256 *
257 * @return          クローン複製されたオブジェクト
258 */
259
260newtRef NsTotalClone(newtRefArg rcvr, newtRefArg r)
261{
262    newtRefVar  result;
263
264    result = NcClone(r);
265
266    if (NewtRefIsFrameOrArray(result))
267    {
268        newtRef *   slots;
269        uint32_t    n;
270        uint32_t    i;
271   
272        slots = NewtRefToSlots(result);
273        n = NewtLength(result);
274   
275        for (i = 0; i < n; i++)
276        {
277            slots[i] = NsTotalClone(rcvr, slots[i]);
278        }
279    }
280
281    return result;
282}
283
284
285/*------------------------------------------------------------------------*/
286/** オブジェクトの長さを取得
287 *
288 * @param r         [in] オブジェクト
289 *
290 * @return          オブジェクトの長さ
291 *
292 * @note            スクリプトからの呼出し用
293 */
294
295newtRef NcLength(newtRefArg r)
296{
297    return NewtMakeInteger(NewtLength(r));
298}
299
300
301/*------------------------------------------------------------------------*/
302/** オブジェクトの(深い)長さを取得
303 *
304 * @param rcvr      [in] レシーバ
305 * @param r         [in] オブジェクト
306 *
307 * @return          オブジェクトの長さ
308 *
309 * @note            フレームの場合はプロト継承で長さを計算する
310 *                  スクリプトからの呼出し用
311 */
312
313newtRef NsDeeplyLength(newtRefArg rcvr, newtRefArg r)
314{
315    return NewtMakeInteger(NewtDeeplyLength(r));
316}
317
318
319/*------------------------------------------------------------------------*/
320/** オブジェクトの(深い)長さを取得
321 *
322 * @param rcvr      [in] レシーバ
323 * @param r         [in] オブジェクト
324 * @param len       [in] 長さ
325 *
326 * @return          オブジェクトの長さ
327 *
328 * @note            フレームの場合はプロト継承で長さを計算する
329 *                  スクリプトからの呼出し用
330 */
331
332newtRef NsSetLength(newtRefArg rcvr, newtRefArg r, newtRefArg len)
333{
334    int32_t n;
335
336    if (NewtRefIsReadonly(r))
337        return NewtThrow(kNErrObjectReadOnly, r);
338
339    if (! NewtRefIsInteger(len))
340        return NewtThrow(kNErrNotAnInteger, len);
341
342    n = NewtRefToInteger(len);
343
344    switch (NewtGetRefType(r, true))
345    {
346        case kNewtBinary:
347        case kNewtString:
348            NewtBinarySetLength(r, n);
349            break;
350
351        case kNewtArray:
352            NewtSlotsSetLength(r, n, kNewtRefUnbind);
353            break;
354
355        case kNewtFrame:
356            return NewtThrow(kNErrUnexpectedFrame, r);
357
358        default:
359            return NewtThrow(kNErrNotAnArrayOrString, r);
360    }
361
362    return r;
363}
364
365
366/*------------------------------------------------------------------------*/
367/** フレーム内のスロットの有無を調べる
368 *
369 * @param rcvr      [in] レシーバ
370 * @param frame     [in] フレーム
371 * @param slot      [in] スロットシンボル
372 *
373 * @retval          TRUE    スロットが存在する
374 * @retval          NIL     スロットが存在しない
375 *
376 * @note            スクリプトからの呼出し用
377 */
378
379newtRef NsHasSlot(newtRefArg rcvr, newtRefArg frame, newtRefArg slot)
380{
381    return NewtMakeBoolean(NewtHasSlot(frame, slot));
382}
383
384
385/*------------------------------------------------------------------------*/
386/** フレームからスロットの値を取得
387 *
388 * @param rcvr      [in] レシーバ
389 * @param frame     [in] フレーム
390 * @param slot      [in] スロットシンボル
391 *
392 * @return          スロットの値
393 */
394
395newtRef NsGetSlot(newtRefArg rcvr, newtRefArg frame, newtRefArg slot)
396{
397    newtObjRef  obj;
398
399    obj = NewtRefToPointer(frame);
400
401    if (obj != NULL)
402        return NcResolveMagicPointer(NewtObjGetSlot(obj, slot));
403    else
404        return kNewtRefUnbind;
405}
406
407
408/*------------------------------------------------------------------------*/
409/** フレームにスロットの値をセットする
410 *
411 * @param rcvr      [in] レシーバ
412 * @param frame     [in] フレーム
413 * @param slot      [in] スロットシンボル
414 * @param v         [in] 値オブジェクト
415 *
416 * @return          値オブジェクト
417 */
418
419newtRef NsSetSlot(newtRefArg rcvr, newtRefArg frame, newtRefArg slot, newtRefArg v)
420{
421    newtObjRef  obj;
422
423    obj = NewtRefToPointer(frame);
424
425    if (obj != NULL)
426    {
427        if (NewtRefIsReadonly(frame))
428            return NewtThrow(kNErrObjectReadOnly, frame);
429
430        return NewtObjSetSlot(obj, slot, v);
431    }
432
433   return kNewtRefNIL;
434}
435
436
437/*------------------------------------------------------------------------*/
438/** フレームからスロットを削除する
439 *
440 * @param rcvr      [in] レシーバ
441 * @param frame     [in] フレーム
442 * @param slot      [in] スロットシンボル
443 *
444 * @return          フレーム
445 */
446
447newtRef NsRemoveSlot(newtRefArg rcvr, newtRefArg frame, newtRefArg slot)
448{
449    newtObjRef  obj;
450
451    obj = NewtRefToPointer(frame);
452    NewtObjRemoveSlot(obj, slot);
453
454    return frame;
455}
456
457
458/*------------------------------------------------------------------------*/
459/** 配列に値をセットする
460 *
461 * @param r         [in] 配列オブジェクト
462 * @param p         [in] 位置
463 * @param v         [in] 値オブジェクト
464 *
465 * @return          値オブジェクト
466 */
467
468newtRef NcSetArraySlot(newtRefArg r, newtRefArg p, newtRefArg v)
469{
470    if (! NewtRefIsInteger(p))
471        return NewtThrow(kNErrNotAnInteger, p);
472
473    return NewtSetArraySlot(r, NewtRefToInteger(p), v);
474}
475
476
477/*------------------------------------------------------------------------*/
478/** オブジェクト内のアクセスパスの有無を調べる
479 *
480 * @param r         [in] オブジェクト
481 * @param p         [in] アクセスパス
482 *
483 * @retval          TRUE    アクセスパスが存在する
484 * @retval          NIL     アクセスパスが存在しない
485 *
486 * @note            スクリプトからの呼出し用
487 */
488
489newtRef NcHasPath(newtRefArg r, newtRefArg p)
490{
491    return NewtMakeBoolean(NewtHasPath(r, p));
492}
493
494
495/*------------------------------------------------------------------------*/
496/** オブジェクトのアクセスパスの値を取得
497 *
498 * @param r         [in] オブジェクト
499 * @param p         [in] アクセスパス
500 *
501 * @return          値オブジェクト
502 *
503 * @note            スクリプトからの呼出し用
504 */
505
506newtRef NcGetPath(newtRefArg r, newtRefArg p)
507{
508    return NewtGetPath(r, p, NULL);
509}
510
511
512/*------------------------------------------------------------------------*/
513/** オブジェクトのアクセスパスに値をセットする
514 *
515 * @param r         [in] オブジェクト
516 * @param p         [in] アクセスパス
517 * @param v         [in] 値オブジェクト
518 *
519 * @return          値オブジェクト
520 */
521
522newtRef NcSetPath(newtRefArg r, newtRefArg p, newtRefArg v)
523{
524    newtRefVar  slot;
525    newtRefVar  target;
526
527    target = NewtGetPath(r, p, &slot);
528
529    if (target == kNewtRefUnbind)
530        NewtThrow(kNErrOutOfBounds, r);
531
532    if (NewtRefIsArray(target))
533        return NcSetArraySlot(target, slot, v);
534    else
535        return NcSetSlot(target, slot, v);
536}
537
538
539/*------------------------------------------------------------------------*/
540/** オブジェクトの指定された位置から値を取得
541 *
542 * @param r         [in] オブジェクト
543 * @param p         [in] 位置
544 *
545 * @return          値オブジェクト
546 *
547 * @note            スクリプトからの呼出し用
548 */
549
550newtRef NcARef(newtRefArg r, newtRefArg p)
551{
552    if (! NewtRefIsInteger(p))
553        return NewtThrow(kNErrNotAnInteger, p);
554
555    return NewtARef(r, NewtRefToInteger(p));
556}
557
558
559/*------------------------------------------------------------------------*/
560/** オブジェクトの指定された位置に値をセットする
561 *
562 * @param r         [in] オブジェクト
563 * @param p         [in] 位置
564 * @param v         [in] 値オブジェクト
565 *
566 * @return          値オブジェクト
567 *
568 * @note            スクリプトからの呼出し用
569 */
570
571newtRef NcSetARef(newtRefArg r, newtRefArg p, newtRefArg v)
572{
573    if (! NewtRefIsInteger(p))
574        return NewtThrow(kNErrNotAnInteger, p);
575
576    return NewtSetARef(r, NewtRefToInteger(p), v);
577}
578
579
580/*------------------------------------------------------------------------*/
581/** プロト・ペアレント継承でフレーム内のスロットの有無を調べる
582 *
583 * @param rcvr      [in] レシーバ
584 * @param r         [in] フレーム
585 * @param name      [in] スロットシンボル
586 *
587 * @retval          TRUE    スロットが存在する
588 * @retval          NIL     スロットが存在しない
589 *
590 * @note            スクリプトからの呼出し用
591 */
592
593newtRef NsHasVariable(newtRefArg rcvr, newtRefArg r, newtRefArg name)
594{
595    return NewtMakeBoolean(NewtHasVariable(r, name));
596}
597
598
599/*------------------------------------------------------------------------*/
600/** プロト・ペアレント継承でフレームからスロットの値を取得
601 *
602 * @param rcvr      [in] レシーバ
603 * @param frame     [in] フレーム
604 * @param slot      [in] スロットシンボル
605 *
606 * @return          スロットの値
607 *
608 * @note            スクリプトからの呼出し用
609 */
610
611newtRef NsGetVariable(newtRefArg rcvr, newtRefArg frame, newtRefArg slot)
612{
613    return NcFullLookup(frame, slot);
614}
615
616
617/*------------------------------------------------------------------------*/
618/** プロト・ペアレント継承でフレームのスロットに値をセット
619 *
620 * @param rcvr      [in] レシーバ
621 * @param frame     [in] フレーム
622 * @param slot      [in] スロットシンボル
623 * @param v         [in] 値オブジェクト
624 *
625 * @return          値オブジェクト
626 *
627 * @note            スクリプトからの呼出し用
628 */
629
630newtRef NsSetVariable(newtRefArg rcvr, newtRefArg frame, newtRefArg slot, newtRefArg v)
631{
632    if (NewtAssignment(frame, slot, v))
633        return v;
634    else
635        return kNewtRefUnbind;
636}
637
638
639/*------------------------------------------------------------------------*/
640/** 変数の有無を調べる
641 *
642 * @param rcvr      [in] レシーバ
643 * @param name      [in] 変数名シンボル
644 *
645 * @retval          TRUE    スロットが存在する
646 * @retval          NIL     スロットが存在しない
647 *
648 * @note            スクリプトからの呼出し用
649 */
650
651newtRef NsHasVar(newtRefArg rcvr, newtRefArg name)
652{
653    return NewtMakeBoolean(NewtHasVar(name));
654}
655
656
657#if 0
658#pragma mark -
659#endif
660/*------------------------------------------------------------------------*/
661/** オブジェクトタイプを対応するクラスシンボルに変換する
662 *
663 * @param type      [in] オブジェクトタイプ
664 *
665 * @return          クラスシンボル
666 */
667
668newtRef NewtRefTypeToClass(uint16_t type)
669{
670    newtRefVar  klass = kNewtRefUnbind;
671
672    switch (type)
673    {
674        case kNewtInt30:
675        case kNewtInt32:
676            klass = NS_INT;
677            break;
678
679        case kNewtCharacter:
680            klass = NS_CHAR;
681            break;
682
683        case kNewtTrue:
684            klass = NSSYM0(boolean);
685            break;
686
687        case kNewtSpecial:
688        case kNewtNil:
689        case kNewtUnbind:
690            klass = NSSYM0(weird_immediate);
691            break;
692
693        case kNewtFrame:
694            klass = NSSYM0(frame);
695            break;
696
697        case kNewtArray:
698            klass = NSSYM0(array);
699            break;
700
701        case kNewtReal:
702            klass = NSSYM0(real);
703            break;
704
705        case kNewtSymbol:
706            klass = NSSYM0(symbol);
707            break;
708
709        case kNewtString:
710            klass = NSSYM0(string);
711            break;
712
713        case kNewtBinary:
714            klass = NSSYM0(binary);
715            break;
716    }
717
718    return klass;
719}
720
721
722/*------------------------------------------------------------------------*/
723/** オブジェクトのクラスシンボルを取得
724 *
725 * @param r         [in] オブジェクト
726 *
727 * @return          クラスシンボル
728 */
729
730newtRef NewtObjClassOf(newtRefArg r)
731{
732    newtObjRef  obj;
733    newtRefVar  klass = kNewtRefNIL;
734
735    obj = NewtRefToPointer(r);
736
737    if (obj != NULL)
738    {
739        if (NewtObjIsFrame(obj))
740        {
741//            klass = NewtObjGetSlot(obj, NS_CLASS);
742            klass = NcProtoLookup(r, NS_CLASS);
743
744            if (NewtRefIsNIL(klass))
745                klass = NSSYM0(frame);
746        }
747        else
748        {
749            klass = obj->as.klass;
750
751            if (klass == kNewtSymbolClass)
752                klass = NSSYM0(symbol);
753            else if (NewtRefIsNIL(klass))
754                klass = NewtRefTypeToClass(NewtGetObjectType(obj, true));
755        }
756    }
757
758    return klass;
759}
760
761
762/*------------------------------------------------------------------------*/
763/** オブジェクトのクラスシンボルをセットする
764 *
765 * @param r         [in] オブジェクト
766 * @param c         [in] クラスシンボル
767 *
768 * @return          オブジェクト
769 */
770
771newtRef NewtObjSetClass(newtRefArg r, newtRefArg c)
772{
773    newtObjRef  obj;
774
775    obj = NewtRefToPointer(r);
776
777    if (obj != NULL)
778    {
779        if (NewtObjIsFrame(obj))
780        {
781            if (NewtRefIsReadonly(r))
782            {
783                NewtThrow(kNErrObjectReadOnly, r);
784                return r;
785            }
786
787            NewtObjSetSlot(obj, NS_CLASS, c);
788        }
789        else
790        {
791            obj->as.klass = c;
792        }
793    }
794
795    return r;
796}
797
798
799/*------------------------------------------------------------------------*/
800/** オブジェクトのプリミティブクラスを取得
801 *
802 * @param rcvr      [in] レシーバ
803 * @param r         [in] オブジェクト
804 *
805 * @return          プリミティブクラス
806 */
807
808newtRef NsPrimClassOf(newtRefArg rcvr, newtRefArg r)
809{
810    newtRefVar  klass;
811
812    if (NewtRefIsPointer(r))
813    {
814        switch (NewtGetRefType(r, true))
815        {
816            case kNewtFrame:
817                klass = NSSYM0(frame);
818                break;
819
820            case kNewtArray:
821                klass = NSSYM0(array);
822                break;
823
824            default:
825                klass = NSSYM0(binary);
826                break;
827        }
828    }
829    else
830    {
831        klass = NSSYM(immediate);
832    }
833
834    return klass;
835}
836
837
838/*------------------------------------------------------------------------*/
839/** オブジェクトのクラスシンボルを取得
840 *
841 * @param r         [in] オブジェクト
842 *
843 * @return          クラスシンボル
844 */
845
846newtRef NcClassOf(newtRefArg r)
847{
848    if (NewtRefIsPointer(r))
849        return NewtObjClassOf(r);
850    else
851        return NewtRefTypeToClass(NewtGetRefType(r, false));
852}
853
854
855/*------------------------------------------------------------------------*/
856/** オブジェクトのクラスシンボルをセットする
857 *
858 * @param r         [in] オブジェクト
859 * @param c         [in] クラスシンボル
860 *
861 * @retval          オブジェクト  クラスシンボルをセットできた場合
862 * @retval          NIL         クラスシンボルをセットできなかった場合
863 */
864
865newtRef NcSetClass(newtRefArg r, newtRefArg c)
866{
867    if (NewtRefIsPointer(r))
868        return NewtObjSetClass(r, c);
869    else
870        return kNewtRefNIL;;
871}
872
873
874/*------------------------------------------------------------------------*/
875/** 参照の比較
876 *
877 * @param r1        [in] 参照1
878 * @param r2        [in] 参照2
879 *
880 * @retval          TRUE    同値
881 * @retval          NIL     同値でない
882 *
883 * @note            スクリプトからの呼出し用
884 */
885
886newtRef NcRefEqual(newtRefArg r1, newtRefArg r2)
887{
888    return NewtMakeBoolean(NewtRefEqual(r1, r2));
889}
890
891
892/*------------------------------------------------------------------------*/
893/** オブジェクトの比較
894 *
895 * @param rcvr      [in] レシーバ
896 * @param r1        [in] オブジェクト1
897 * @param r2        [in] オブジェクト2
898 *
899 * @retval          TRUE    同値
900 * @retval          NIL     同値でない
901 *
902 * @note            スクリプトからの呼出し用
903 */
904
905newtRef NsObjectEqual(newtRefArg rcvr, newtRefArg r1, newtRefArg r2)
906{
907    return NewtMakeBoolean(NewtObjectEqual(r1, r2));
908}
909
910
911/*------------------------------------------------------------------------*/
912/** シンボルを字句的に比較(大文字小文字は区別されない)
913 *
914 * @param rcvr      [in] レシーバ
915 * @param r1        [in] シンボル1
916 * @param r2        [in] シンボル2
917 *
918 * @retval          負の整数    r1 < r2
919 * @retval          0       r1 = r2
920 * @retval          正の整数    r1 > r2
921 *
922 * @note            スクリプトからの呼出し用
923 */
924
925newtRef NsSymbolCompareLex(newtRefArg rcvr, newtRefArg r1, newtRefArg r2)
926{
927    if (! NewtRefIsSymbol(r1))
928        return NewtThrow(kNErrNotASymbol, r1);
929
930    if (! NewtRefIsSymbol(r2))
931        return NewtThrow(kNErrNotASymbol, r2);
932
933    return NewtMakeInteger(NewtSymbolCompareLex(r1, r2));
934}
935
936
937/*------------------------------------------------------------------------*/
938/** sub が supr のサブクラスを含むかチェックする
939 *
940 * @param rcvr      [in] レシーバ
941 * @param sub       [in] シンボルオブジェクト1
942 * @param supr      [in] シンボルオブジェクト2
943 *
944 * @retval          TRUE    サブクラスを含む
945 * @retval          NIL     サブクラスを含まない
946 *
947 * @note            スクリプトからの呼出し用
948 */
949
950newtRef NsHasSubclass(newtRefArg rcvr, newtRefArg sub, newtRefArg supr)
951{
952    return NewtMakeBoolean(NewtHasSubclass(sub, supr));
953}
954
955
956/*------------------------------------------------------------------------*/
957/** sub が supr のサブクラスかチェックする
958 *
959 * @param rcvr      [in] レシーバ
960 * @param sub       [in] シンボルオブジェクト1
961 * @param supr      [in] シンボルオブジェクト2
962 *
963 * @retval          TRUE    サブクラスである
964 * @retval          NIL     サブクラスでない
965 *
966 * @note            スクリプトからの呼出し用
967 */
968
969newtRef NsIsSubclass(newtRefArg rcvr, newtRefArg sub, newtRefArg supr)
970{
971    return NewtMakeBoolean(NewtIsSubclass(sub, supr));
972}
973
974
975/*------------------------------------------------------------------------*/
976/** obj が r のインスタンスかチェックする
977 *
978 * @param rcvr      [in] レシーバ
979 * @param obj       [in] オブジェクト
980 * @param r         [in] クラスシンボル
981 *
982 * @retval          TRUE    インスタンスである
983 * @retval          NIL     インスタンスでない
984 *
985 * @note            スクリプトからの呼出し用
986 */
987
988newtRef NsIsInstance(newtRefArg rcvr, newtRefArg obj, newtRefArg r)
989{
990    return NewtMakeBoolean(NewtIsInstance(obj, r));
991}
992
993
994#if 0
995#pragma mark -
996#endif
997/*------------------------------------------------------------------------*/
998/** r が配列かチェックする
999 *
1000 * @param rcvr      [in] レシーバ
1001 * @param r         [in] オブジェクト
1002 *
1003 * @retval          TRUE    配列である
1004 * @retval          NIL     配列でない
1005 *
1006 * @note            スクリプトからの呼出し用
1007 */
1008
1009newtRef NsIsArray(newtRefArg rcvr, newtRefArg r)
1010{
1011    return NewtMakeBoolean(NewtRefIsArray(r));
1012}
1013
1014
1015/*------------------------------------------------------------------------*/
1016/** r がフレームかチェックする
1017 *
1018 * @param rcvr      [in] レシーバ
1019 * @param r         [in] オブジェクト
1020 *
1021 * @retval          TRUE    フレームである
1022 * @retval          NIL     フレームでない
1023 *
1024 * @note            スクリプトからの呼出し用
1025 */
1026
1027newtRef NsIsFrame(newtRefArg rcvr, newtRefArg r)
1028{
1029    return NewtMakeBoolean(NewtRefIsFrame(r));
1030}
1031
1032
1033/*------------------------------------------------------------------------*/
1034/** r がバイナリかチェックする
1035 *
1036 * @param rcvr      [in] レシーバ
1037 * @param r         [in] オブジェクト
1038 *
1039 * @retval          TRUE    バイナリである
1040 * @retval          NIL     バイナリでない
1041 *
1042 * @note            スクリプトからの呼出し用
1043 */
1044
1045newtRef NsIsBinary(newtRefArg rcvr, newtRefArg r)
1046{
1047    return NewtMakeBoolean(NewtRefIsBinary(r));
1048}
1049
1050
1051/*------------------------------------------------------------------------*/
1052/** r がシンボルかチェックする
1053 *
1054 * @param rcvr      [in] レシーバ
1055 * @param r         [in] オブジェクト
1056 *
1057 * @retval          TRUE    シンボルである
1058 * @retval          NIL     シンボルでない
1059 *
1060 * @note            スクリプトからの呼出し用
1061 */
1062
1063newtRef NsIsSymbol(newtRefArg rcvr, newtRefArg r)
1064{
1065    return NewtMakeBoolean(NewtRefIsSymbol(r));
1066}
1067
1068
1069/*------------------------------------------------------------------------*/
1070/** r が文字列かチェックする
1071 *
1072 * @param rcvr      [in] レシーバ
1073 * @param r         [in] オブジェクト
1074 *
1075 * @retval          TRUE    文字列である
1076 * @retval          NIL     文字列でない
1077 *
1078 * @note            スクリプトからの呼出し用
1079 */
1080
1081newtRef NsIsString(newtRefArg rcvr, newtRefArg r)
1082{
1083    return NewtMakeBoolean(NewtRefIsString(r));
1084}
1085
1086
1087/*------------------------------------------------------------------------*/
1088/** r が文字かチェックする
1089 *
1090 * @param rcvr      [in] レシーバ
1091 * @param r         [in] オブジェクト
1092 *
1093 * @retval          TRUE    文字である
1094 * @retval          NIL     文字でない
1095 *
1096 * @note            スクリプトからの呼出し用
1097 */
1098
1099newtRef NsIsCharacter(newtRefArg rcvr, newtRefArg r)
1100{
1101    return NewtMakeBoolean(NewtRefIsCharacter(r));
1102}
1103
1104
1105/*------------------------------------------------------------------------*/
1106/** r が整数かチェックする