-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtao-l.lisp
1390 lines (1193 loc) · 41.3 KB
/
tao-l.lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
(tao:common-lisp)
(in-package #:tao-internal)
(define
"labels"
(macro (local-functions &body body)
`(labels ,local-functions ,@body))
:documentation
"形式 : labels ((f-name1 (arg11 arg12 ... ) body1)
(f-name2 (arg21 arg22 ... ) body2)
...
form1 form2 ...
ローカル変数を定義し、それを実行する。
f-name1 f-name2 ... を関数名、arg11 arg12 ...、arg21 arg22 ... を引数、
body1 body2 ... を関数本体とするローカル関数 (スコープ透過関数)を定義し、
form1 form2 ... を逐次評価し、最後のフォームの評価結果を返す。これらの
フォームが全く省略されると nil を返す。
定義された関数は、関数 dye によって定義されたと同じ。しかし、それらの
スコープは labels 式内に制限される。ゆえに、ローカル変数 arg11 arg12
arg21 arg22 ... は labels の外で値を取ることはできないし、定義された
ローカル関数の関数本体で、labels の外で定義されたグローバルな関数を参照
できる。定義されたローカル関数は、それらの関数本体で用いることができる。
スコープを除いて、関数 flet と同じ。"
:example
"(defun f00 (x) (1+ x)) -> f00
(f00 10) -> 11
(labels ((f00 (x) (1- x))
(bar (x) (f00 x))) (bar 10)) -> 9
(labels ((f1 (x y) (x + y))
(g1 (a b) (+ (a * b) (f1 10 20))))
(g1 3 5)) -> 45
(labels ((f2 (x y) (x + y + p)
(g2 (p) (p * (f2 10 20))))
(g2 100)) -> 13000")
(define
"lambda"
(macro (lambda-list &body body)
(let ((lambda-list (canonicalize-lambda-list-keyword lambda-list)))
`(lambda ,lambda-list
(declare (dynamic-extent ,@(set-difference lambda-list tao-lambda-list-keywords)))
,@body)))
:documentation
"形式 : lambda var-list body
var-list を引数リストとするラムダ関数 (スコープ透過関数) をつくる。
この式が評価されたときに関数のオブジェクトを生成。
動的なエクステントを持つ。"
:example
"(lambda (x) (x * x))")
(define
"common:lambda"
(cl-macro lambda)
:documentation
"形式 : common:lambda var-list body
var-list を引数リストとするラムダ関数 (スコープ透過関数) をつくる。
この式が評価されたときに関数のオブジェクトを生成。
静的なエクステントを持つ。"
:example
"(common:lambda (x) (* x x) 3) -> 9")
(define
"lambda-list-keywords"
(constant tao-lambda-list-keywords)
:documentation
"lambda-list-keywords = (&optional &optn &opt :opt &rest &aux
:aux &key &allow-other-keys &whole &body
&environment)"
:example
"")
(define
"lambda-parameters-limit"
(constant lambda-parameters-limit)
:documentation
"lambda-parameters-limit = 128"
:example "")
(define
"lappend"
(rel
(( (_a . _x) _y (_a . _z))
(tao:lappend _x _y _z))
(( () _x _x)))
:documentation
"形式 : lappend x y z
ロジカルな (prolog 型) append 関数。
下式と同じ。
(assertz (lappend (_a . _x) _y (_a . _z)) (lappend _x _y _z))
(assertz (lappend () _x _x))"
:example
"(lappend (1) (2) (1 2)) -> t")
(define
"last"
#'last
:documentation
"形式 : last list
list の最後のセルを返す。"
:example
"(last '(o w a r i)) -> (i)
(last nil) -> nil")
(define
"lcm"
#'lcm
:documentation
"形式 : lcm integer &rest integer1 integer2 ... integerN
integer1 integer2 ... integerN の最小公倍数を返す。"
:example
"(lcm 14 35) -> 70
(lcm 0 5) -> 0
(lcm 1 2 3 4 5 6) -> 60")
(define
"ldb"
#'ldb
:documentation
"形式 : ldb bytespec integer
integer を 2 の補数で表し、そのバイト指定子 bytespec で指定されたビット
列を返す。"
:example
"(ldb (byte 1 2) 3) -> #0
(ldb (byte 13 5) 100) -> #3")
(define
"ldb-test"
#'ldb-test
:documentation
"形式 : ldb-test bytespec integer
integer を 2 の補数で表し、そのバイト指定子 bytespec で指定されたビット
列の内、どれかのビットが 1 の場合、t を返す。
すべてのビットが 0 なら nil を返す。"
:example
"(ldb-test (byte 1 2) 3) -> nil
(ldb-test (byte 13 5) 100) -> t")
(define
"ldiff"
#'ldiff
:documentation
"形式 : ldiff list1 list2
list2 が list1 のサブリストと eq ならば、list1 から list2 を除いた
リストを返す。そうでなければ、list1 のコピーを返す。"
:example
"x = (a b c d e f) とすると
(ldiff x (cdddr x)) -> (a b c) で
x = (a b c d e f)
しかし
(ldiff x '(d e f)) -> (a b c d e f)")
(define
"leap-year-p"
(expr (int)
(cond ((zerop (mod int 400)) t)
((zerop (mod int 100)) nil)
((zerop (mod int 4)) t)
('T nil)))
:documentation
"形式 : leap-year-p integer
integer がうるう年ならば 0 を返し、そうでなければ nil を返す。"
:example
"")
(define
"least-negative-double-float"
(constant least-negative-double-float)
:documentation
"double-float 演算において取り得る最も小さい負の値が格納されている
システム定数であり、このシステムの場合は -4.94065645841247f-324。"
:example
"")
(define
"least-negative-long-float"
(constant least-negative-long-float)
:documentation
"long-float 演算において取り得る最も小さい負の値が格納されている
システム定数であり、このシステムの場合は -4.94065645841247f-324。"
:example
"")
(define
"least-negative-short-float"
(constant least-negative-short-float)
:documentation
"short-float 演算において取り得る最も小さい負の値が格納されている
システム定数であり、このシステムの場合は -1.0842021724855s-19。"
:example
"")
(define
"least-negative-single-float"
(constant least-negative-single-float)
:documentation
"single-float 演算において取り得る最も小さい負の値を格納した
システム定数であり、このシステムの場合は -4.94065645841247f-324。"
:example
"")
(define
"least-positive-double-float"
(constant least-positive-double-float)
:documentation
"double-float 演算において取り得る最も小さい正の値を格納した
システム定数であり、このシステムの場合は 4.94065645841247f-324。"
:example
"")
(define
"least-positive-long-float"
(constant least-positive-long-float)
:documentation
"long-float 演算において取り得る最も小さい正の値を格納した
システム定数であり、このシステムの場合は 4.94065645841247f-324。"
:example
"")
(define
"least-positive-short-float"
(constant least-positive-short-float)
:documentation
"short-float 演算において取り得る最も小さい正の値を格納した
システム定数であり、このシステムの場合は 1.0842e-19。"
:example
"")
(define
"least-positive-single-float"
(constant least-positive-single-float)
:documentation
"single-float 演算において取り得る最も小さい正の値を格納した
システム定数であり、このシステムの場合は 4.94065645841247f-324。"
:example
"")
(define
"common:length"
(expr nil)
:documentation
"形式 : common:length seq
シーケンス seq の長さ (要素数) を負以外の整数形式で返す。
seq がフィルポインタを持つベクタの場合は、フィルポインタによって
示される実際の長さを返す。"
:example
"(common:length \"abcde\") -> 5
(common:length '(a b c)) -> 3
(!v (vcons \"vec\" 5))
-> {vector}1839901(\"vector\" . 5)
(common:length v) -> 5
(common:length #(a b c d)) -> 4")
(define
"length"
(subr (arg)
(typecase arg
(list (do ((l arg (cdr l))
(cnt 0 (1+ cnt)))
((endp l) cnt)))
(T 0)))
:documentation
"形式 : length arg
arg がリストなら、その長さ (要素の数) を返し、そうでなければ 0 を返す。"
:example
"(length '(a b c)) -> 3
(length '(a b . c)) -> 2
(length nil) -> 0
(length 123) -> 0
(length \"abcde\") -> 0")
(define
"lessp"
(subr (&rest numbers)
(every #'< numbers (cdr numbers)))
:documentation
"形式 : lessp &rest number1 number2 ... numberN
number1 number2 ... numberN を左から右に順に比較し、完全に単純増加
(等しいものがあってもいけない) している場合は t を返し、そうでなければ
nil を返す。"
:example
"(lessp 9 10) -> t
(lessp 10 9) -> nil
(lessp 1 2 3 4 5) -> t
(lessp 1 1) -> nil
(lessp) -> t
(lessp #c(2 3) #c(4 5)) -> エラー")
(eval-when (:compile-toplevel :load-toplevel :execute)
(defun canonicalize-bvl (bvl)
(mapcar (lambda (v)
(etypecase v
(symbol `(,v ,(if (var-name-p v)
`(tao:undef)
nil)))
(cons v)))
bvl)))
(deftype locative-declaration ()
`(member tao:signed-integer-locatives
tao:unsigned-integer-locatives
tao:float-locatives))
(defun locative-declaration-p (form)
(case (and (consp form) (car form))
(tao:signed-integer-locatives :int64)
(tao:unsigned-integer-locatives :uint64)
(tao:float-locatives :double)
(otherwise nil)))
(defmacro locally/deref (&body body)
`(locally
,@(butlast body)
(values-list (mapcar (lambda (v)
(cond ((tao:locbitp v)
(tao:deref v))
((tao.logic::var-p v)
(tao.logic::deref-exp v))
(T v)))
(multiple-value-list ,@(last body))))))
(define-compiler-macro locally/deref (&whole w &body body)
(cond ((tao.logic::variable-p (car (last body)))
`(locally ,@(butlast body) (tao.logic::deref-exp ,@(last body))))
((locative-declaration-p (car body)) w)
(T `(locally ,@body))))
(define
"let"
(macro ((&rest bindings) &body body)
#+lispworks
(if (locative-declaration-p (car body))
(let ((type (locative-declaration-p (car body)))
(locative-vars (cdr (car body))))
`(fli:with-dynamic-foreign-objects (,@(mapcar (lambda (b)
(check-type b (and symbol (not null)))
`(,b ,type))
locative-vars))
(cl:let (,@(remove-if (lambda (v)
(find (car v) locative-vars))
(canonicalize-bvl bindings)))
(locally/deref
,@body))))
`(cl:let (,@(canonicalize-bvl bindings))
(locally/deref
,@body)))
#-lispworks
`(cl:let (,@(canonicalize-bvl bindings))
,@body))
:documentation
"形式 : let ((var1 val-form1)
(var2 val-form2)
... )
body
まず、フォーム val-form1 val-form2 ... を各々左から右へ順に評価する。
次に変数 val1 val2 ... を各々 val-form1 val-form2 ... の値に同時に束縛
する。そして body 中のフォームを左から右へ順に評価し、最後のフォームの
値を返す。val-formI は省略可能で、その場合、varI は nil となる。"
:example
"(!x 2) -> 2
(let ((x 3) (y (* x x)))
(* x y y)) -> 48")
(define
"let*"
(macro ((&rest bindings) &body body)
`(cl:let* (,@(canonicalize-bvl bindings)) ,@body))
:documentation
"形式 : let* ((var1 val-form1)
(var2 val-form2)
... )
form1 form2 ...
まずフォーム val-form1 を評価し変数 var1 をその評価結果に束縛する。
次に val-form2 を評価し var2 をその評価結果に束縛する。
以下、逐次的に、val-formI を評価し varI をその評価結果に束縛していく。
そして、form1 form2 ... を順に評価し、最後のフォームの評価結果を返す。
val-formI は省略可能で、その場合、varI は nil となる。
ローカル変数の初期値の評価とその束縛は順に実行されるので先に束縛された
ローカル変数 (例えば var1) の束縛結果を次のローカル変数 (例えば var2)
の初期値の評価に使うことができる。"
:example
"(let* ((x 3) (y (* x x)))
(* x y y)) -> 243")
(define
"lins"
(subr (vector key)
(do ((lim (1- (cl:length vector)))
(idx 0 (+ idx 2)))
((< lim idx) nil)
(and (equal (aref vector idx) key)
(>= lim (1+ idx))
(return (aref vector (1+ idx))))))
:documentation
"形式 : lins vector key
vector の偶数番目の要素に key があれば、その次の要素の値を返し、
なければ nil を返す。ベクタの大きさが奇数の場合、最後の構成要素は検索
しない。"
:example
"(lins vec 2) -> \"b\"")
(define
"lisp-implementation-type"
#'lisp-implementation-type
:documentation
"特定の Common Lisp 処理系の一般の名前を表す文字列を返す。
ELIS システムでは、\"TAO\" を返す。"
:example
"\"TAO\"
\"SpiceLisp\"
\"ZetaLisp\"")
(define
"lisp-implementation-version"
#'lisp-implementation-version
:documentation
"特定の Common Lisp 処理系のバージョンを識別する文字列を返す。
ELIS システムでは、\"25-Mar-87 TAO interpreter\" を返す。"
:example
"\"25-Mar-87 TAO interpreter\"
\"1192\"
\"53, 7 with complex numbers\"
\"1746.9A,NEWIO 53, ETHER 5.3\"")
(define
"list"
#'list
:documentation
"形式 : list &rest arg1 arg2 ... argN
arg1 arg2 ... argN を要素とするリストを作成し、返す。各要素は、適用
される前に評価される。listq 参照。"
:example
"(list) -> ()
(list 1) -> (1)
(list 1 2 3 4 5) -> (1 2 3 4 5)
(list '(1 2 3) '(4 5) 6) -> ((1 2 3) (4 5) 6)
(list 3 4 'a (car '(b . c)) (+ 6 -2)) -> (3 4 a b 4)
(list a b) a または b が unboundならエラー")
(define
"list*"
#'list*
:documentation
"形式 : list* &rest arg1 arg2 ... argN
arg1 arg2 ... argN を要素とするリストを作成し、返す。
最後の 2 つの要素はコンス (cons) される。
各要素は適用される前に評価される。"
:example
"(list* 'a 'b 'c 'd) = (cons 'a (cons 'b (cons 'c 'd)))
= (a b c . d)
(list* 'a 'b '(c d)) = (a b c d)
(list* 'a) = a")
(define
"listing"
(subr (predicates &optional (out *standard-output*))
(dolist (p predicates)
(dolist (c (get p 'tao.logic::clauses))
(pprint (cons 'tao:assert c) out))))
:documentation
"c.f. ..."
:example
"")
(define
"list-all-global-packages"
(expr nil)
:documentation
"システムに存在する全ての大域パッケージのリストを返す。"
:example
"(package-name (list-all-global-packages))
-> (\"apropos\" \"net\" \"step\" \"sys\" \"key\" \"bas\")")
(define
"list-all-packages"
#'list-all-packages
:documentation
"形式 : list-all-packages &opt root
根パッケージ root (既定値 sys:univ-package) からアクセスできる全ての
パッケージのリストを返す。"
:example
"(package-name (bas:list-all-packages))
-> (\"univ\" \"apropos\" \"net\" \"step\" \"sys\" \"key\" \"bas\"
\"gonta\" \"hanako\" \"gonbe\" \"etc\")
(list-all-packages) -> ({vector}61776(package . 12)
{vector}41496(package . 12)
...")
(define
"list-length"
#'list-length
:documentation
"形式 : list-length list
list が巡回リスト以外のリストの場合、list の長さを整数形式で返し、巡回
リストなら nil を返す。"
:example
"(list-length'( )) -> 0
(list-length'(a b c d)) -> 4
(list-length'(a (b c) d) -> 3
(let ((x (list 'a 'b 'c))
(rplacd (last x) x)
(list-length x)) -> nil")
(define
"list-stream"
(class stream)
:documentation
"インスタンスがリストストリームであるクラス。
このストリームに送られたデータは列を作り、そのデータは、FIFO 的に
このストリームからとられる。"
:example
"")
(define
"listen"
#'listen
:documentation
"形式 : listen &opt stream
stream から即座に使用可能な文字が存在するのであれば (#\\return) 、
そうでなければ (\"\" null ストリング) を返す。"
:example
"(!aa (open \"asd.tao\")) -> {udo}1171307file-stream
(read aa) -> kyouwaiitenki
(listen aa) -> #\\return
(read aa) -> ashitamoiitenki
(listen aa) -> \"\"
(read aa) -> :eof")
(define
"listp"
(subr (object)
(and (cl:listp object) object))
:documentation
"形式 : listp object
object がリストか、car 関数と cdr 関数が両方とも適用できるものであれば、
その評価値を返し、それ以外なら nil を返す。
object は listp 関数に適用される前に評価される。"
:example
"(listp '(a b c d)) -> (a b c d)
(listp '[a b c d]) -> [a b c d]
(listp 'a) -> nil
(listp ''a) -> 'a
(listp '^(a b `c d)) -> ^(a b `c d)
(listp '(!x (fn y))) -> (!x (fn y))
(listp (caddr '(!!cons 123 !x))) -> !x
(listp (caddr '(list a b))) -> nil
(listp ()) -> t
(listp '(a . b)) -> (a . b)")
(define
"listq"
(macro (&body args)
`(list ,@(mapcar (lambda (x) `',x) args)))
:documentation
"形式 : listq &rest arg1 arg2 ... argN
arg1 arg2 ... argN を要素とするリストを作成し、返す。
各要素は適用される前に評価されない。list 参照。"
:example
"(listq) -> ()
(listq a) -> (a)
(listq a b) -> (a b)
(listq 'a 'b) -> ('a 'b)
(listq a b c d e) -> (a b c d e)")
(define
"load"
#'load
:documentation
"形式 : load file
file をロードする。
file の既定値は、変数 *default-pathname-defaults* からとられる。"
:example
"(load \"<dir1>file1.typ1\")
(load \"file2.tao\")")
(define "load-factor-min" (expr nil) :documentation "最新 1 分間の負荷係率を返す。" :example "(load-factor-min) -> 0")
(define "load-factor-sec" (expr nil) :documentation "最新 1 秒間の負荷係率を返す。" :example "(load-factor-sec) -> 1")
(define
"load-if-non-existent"
(expr (func file)
(if (fboundp func)
nil
(load file)))
:documentation
"形式 : load-if-non-existent func file
もし関数 func がロードされていなければ file をロードする。ロードされて
いれば nil を返す。"
:example
"")
(define
"loc-diff"
(subr nil)
:documentation
"形式 : loc-diff locbit1 locbit2
ロックビット locbit1 のオフセット値 ( 0 から始まる数字) から、locbit2
のオフセット値を引いた結果をメモリブロック内の語アドレスを示す
shortnum で返す。これらのロックビットは同じメモリブロック内にある必要は
ない。"
:example
"aaa を大きさが 20 の 8 ビットメモリブロックとする。
(!bbb (locbit aaa 5)) ->
{locbit}({memblk}480396(#!8b-memblk . {dnil}20) . {dnil}5)
(!ccc (locbit aaa 12)) ->
{locbit}({memblk}480396(#!8b-memblk . {dnil}20) . {dnil}12)
(loc-diff bbb ccc) -> -7
(loc-diff ccc bbb) -> 7")
(define
"loc-equate"
(subr nil)
:documentation
"形式 : loc-equate locbit1 locbit2
ロックビット locbit2 の値を locbit1 に代入し、その値を返す。
locbit2 が shortnum なら locbit1 のオフセット値 (メモリブロック内の語
アドレスを示す 0 から始まる数字) を locbit2 に設定し、その値を返す。"
:example
"aaa を大きさが 20 の 8 ビットメモリブロックとする。
(!bbb (locbit aaa 5)) ->
{locbit}({memblk}480396(#!8b-memblk . {dnil}20) . {dnil}5)
(!ccc (locbit aaa 12)) ->
{locbit}({memblk}480396(#!8b-memblk . {dnil}20) . {dnil}12)
(loc-offset bbb) -> 5
(loc-offset ccc) -> 12
(loc-equate bbb ccc) ->
{locbit}({memblk}480396(#!8b-memblk . {dnil}20) . {dnil}12)
(loc-offset bbb) -> 12
(loc-equate bbb 17) ->
{locbit}({memblk}480396(#!8b-memblk . {dnil}20) . {dnil}17)
(loc-offset bbb) -> 17")
(define
"loc-greaterp"
(subr nil)
:documentation
"形式 : loc-greaterp locbit1 locbit2
ロックビット locbit1 のオフセット値 (メモリブロック内の語を指す 0 から
始まる数字) が、locbit2 のオフセット値より大きければ、locbit1 の値を返
し、そうでなければ nil を返す。"
:example
"aaa を大きさ 20 の 8 ビットメモリブロックとする。
(!bbb (locbit aaa 5)) ->
{locbit}({memblk}480396(#!8b-memblk . {dnil}20) . {dnil}5)
(!ccc (locbit aaa 12) ->
{locbit}({memblk}480396(#!8b-memblk . {dnil}20) . {dnil}12)
(loc-greaterp bbb ccc) -> nil
(loc-greaterp ccc bbb) ->
{locbit}({memblk}480396(#!8b-memblk . {dnil}20) . {dnil}12)")
(define
"loc-lessp"
(subr nil)
:documentation
"形式 : loc-lessp locbit1 locbit2
ロックビット locbit1 のオフセット値 (メモリブロック内の語を指す 0 から
始まる数字) が、locbit2 のオフセット値より小さければ、locbit1 の値を返
し、そうでなければ nil を返す。"
:example
"aaa を大きさ 20 の 8 ビットメモリブロックとする。
(!bbb (locbit aaa 5)) ->
{locbit}({memblk}480396(#!8b-memblk . {dnil}20) . {dnil}5)
(!ccc (locbit aaa 12) ->
{locbit}({memblk}480396(#!8b-memblk . {dnil}20) . {dnil}12)
(loc-lessp bbb ccc) -> nil
(loc-lessp ccc bbb) ->
{locbit}({memblk}480396(#!8b-memblk . {dnil}20) . {dnil}5)")
(define
"loc-memblk"
(subr nil)
:documentation
"形式 : loc-memblk object
object がロックビットなら、そのロックビットが格納されている
メモリブロックへのポインタを返し、そうでなければエラーを返す。"
:example
"(!aaa (get-memblk #!8b-memblk 20)) ->
{memblk}480569(#!8b-memblk . {dnil}20)
(!bbb (locbit aaa)) ->
{locbit}({memblk}480569(#!8b-memblk . {dnil}20))
(loc-memblk bbb) -> {memblk}480569(#!8b-memblk . {dnil}20)")
(define
"loc-offset"
(subr nil)
:documentation
"形式 : loc-offset locbit
ロックビット locbit のオフセット値 (メモリブロック内の語を指す 0 から始
まる番号) を shortnum で返す。"
:example
"(!aaa (get-memblk #!8b-memblk 20)) ->
{memblk}480569(#!8b-memblk . {dnil}20)
(!bbb (locbit aaa 15))->
{locbit}({memblk}480569(#!8b-memblk . {dnil}20) . {dnil}15)
(loc-offset bbb) -> 15")
(define
"loc-size"
(subr nil)
:documentation
"形式 : loc-size object
object がロカティブなら、そのロカティブが格納されているメモリブロック
の大きさを返し、ロカティブ以外の場合は、エラーを返す。"
:example
"(!aaa (get-memblk #!8b-memblk 20)) ->
{memblk}480569(#!8b-memblk . {dnil}20)
(!bbb (locbit aaa)) ->
{locbit}({memblk}480569(#!8b-memblk . {dnil}20))
(loc-size bbb) -> 20")
(define
"loc-type"
(subr nil)
:documentation
"形式 : loc-type object
object がロカティブなら、そのロカティブが格納されているメモリブロック
の種別を codnum で返し、ロカティブ以外ならエラーを返す。"
:example
"(!x (locbit (get-memblk #!8b-memblk 20) 3)) ->
{locbit}({memblk}480560(#!8b-memblk . {dnil}20) . {dnil}3)
(loc-type x) -> #!8b-memblk")
(define
"local-echo"
(expr nil)
:documentation
"ローカルエコーモードにする。つまりターミナルストリームへの全ての入力
がターミナルにエコーバックされる。"
:example
"")
(define
"locally"
(macro (&body body)
`(locally ,@body))
:documentation
"形式 : locally &rest form1 form2 ... formN
form1 form2 ... formN を局所的かつ浸透的なフォームとして定義する。
いかなる変数をも束縛しない。"
:example
"(locally (declare (inline floor) (notinline car cdr))
(declare (optimize space))
(floor (car x) (cdr y))")
(define
"locativep"
(subr nil)
:documentation
"形式 : locativep object
object が 64 ビットの符号なしの整数ロカティブ、64 ビットの符号付きの
整数ロカティブ、64 ビットの浮動小数点ロカティブ、あるいはロックビット
ならば評価値を返し、それ以外なら nil を返す。
(locativep x) = (or (64b-signedp x) (64b-unsignedp x)
(64b-floatp x) (locbitp x) )"
:example
"")
(define
"locbit"
(subr (memblk &optional (offset 0))
#+lispworks
(let ((locbit (fli:make-pointer :address (fli:pointer-address memblk)
:type (fli:pointer-element-type memblk))))
(fli:incf-pointer locbit offset)
locbit))
:documentation
"形式 : locbit memblk &opt offset
ロックビットを生成し返す。
生成されたロックビットは、メモリブロック memblk と、memblk 内の offset
が指定する語をポイントする。
offset の値は 0 から始まる番号で既定値は 0 。"
:example
"(!a (get-memblk #!8b-memblk 16))
-> {memblk}480764(#!8b-memblk . {dnil}16)
a は、生成された8ビットメモリブロックへのポインタ。
(!b (locbit a 10)) ->
{locbit}({memblk}480764(#!8b-memblk . {dnil}16) . {dnil}10)
b は、メモリブロック a とメモリブロック a の 10 番目の語を指す。
(loc-offset b) -> 10")
(define
"locbitp"
(subr (obj)
#+lispworks
(fli:pointerp obj))
:documentation
"形式 : locbitp object
object がロックビットなら評価値を返し、それ以外なら nil を返す。"
:example
"(!a (get-memblk #!8b-memblk 16))
-> {memblk}480764(#!8b-memblk . {dnil}16)
a は生成された 8-bit のメモリブロックへのポインタ。
(!b (locbit a 10)) ->
{locbit}({memblk}480764(#!8b-memblk . {dnil}16) . {dnil}10)
(signed-integer-locatives c) -> (c)
(locbitp b) ->
{locbit}({memblk}480764(#!8b-memblk . {dnil}16) . {dnil}10)
(locbitp 'b) -> nil
(locbitp c) -> nil
(locbitp 12) -> nil")
(define
"log"
#'log
:documentation
"形式 : log number1 &opt number2
number2 (既定値は e : 自然対数の底) を底とする number1 の対数を返す。"
:example
"(log 8.0 2) -> 3.0f0
(log 100.0 10) -> 2.0f0
(log 8 2) -> 3.0f0")
(define
"logand"
#'logand
:documentation
"形式 : logand integer &rest integer1 integer2 ... integerN
integer1 integer2 ... integerN のビット毎の論理積を求め、その結果を
8 進数で返す。"
:example
"(logand #10 #34) -> #10
(logand #10 #10) -> #10
(logand 8 8) -> #10
(logand #b1011 #b1101) -> #11")
(define
"common:logand"
(expr nil)
:documentation
"形式 : common:logand &rest integer1 integer2 ... integerN
integer1 integer2 ... integerN のビット毎の論理積を求め、その結果を
10 進数で返す。引数が指定されなければ -1 を返す。"
:example
"(common:logand 10 10) -> 10
(common:logand #o10 #o10) -> 8
(common:logand #b1011 #b1101) -> 3")
(define
"logandc1"
#'logandc1
:documentation
"形式 : logandc1 integer1 integer2
integer1 の値の補数と integer2 の値のビット毎の論理積を求め、その結果を
8 進数で返す。
(boole boole-andc1 integer1 integer2) と同じ。"
:example
"(logandc1 #b1011 #b1101) -> #2
(logandc1 10 20) -> #24
(logandc1 20 10) -> #12")
(define
"logandc2"
#'logandc2
:documentation
"形式 : logandc2 integer1 integer2
integer1 の値と integer2 の値の補数のビット毎の論理積を求め、その結果を
8 進数で返す
(boole boole-andc2 integer1 integer2) と同じ。"
:example
"(logandc2 #b1101 #b1011) -> #2
(logandc2 20 10) -> #24
(logandc2 10 20) -> #12")
(define
"logbitp"
#'logbitp
:documentation
"形式 : logbitp index integer
integer のビット位置 index のビットが 1 の場合は t を、0 の場合は
nil を返す。 ビット位置は 0 から数える非負の整数。
(logbitp x y) = (bit-test y x)"
:example
"(logbitp 2 6) -> t
(logbitp 0 6) -> ()
(logbitp 2 12) -> t
(logbitp 3 12) -> t")
(define
"logcount"
#'logcount
:documentation
"形式 : logcount integer
integer の値が正の場合、その値を 7 ビットの 2 進数で表現した時にその中
に含まれる 1 のビット数を数え、その結果を返す。負の場合は 0 のビット数
を数え、その結果を返す。"
:example
"(logcount 13) -> 3
(logcount -13) -> 2
(logcount 30) -> 4
(logcount -30) -> 4")
(define
"logeqv"
#'logeqv
:documentation
"形式 : logeqv &rest integer1 integer2 .. integerN
integer1 integer2 ... integerN の排他的否定論理和を求め、その結果を
8 進数で返す。
(lognot (logxor integer1 integer2 ... )) と同じ。"
:example
"(logeqv 2 2) -> #77777777
(logeqv 2 0) -> #77777775")
(define
"logic"
(class tao.logic::var)
:documentation
"インスタンスは _x, _y などのような論理変数。"
:example
"")
(define
"logical-names"
(expr nil)
:documentation
"形式 : logical-names &opt process
process (既定値はカレントプロセス) で使われるパス名にロジカルなパス名と
実際のパス名をペアとする連想リストを返す。"
:example
"(logical-names) -> ((\"Co\" (\"n\" \"bs\" . \"ntec\")
(\"sys\" \"bs\" . \"sys\")
(\"z\" \"bs\" . \"zuk\")))")
(define
"logicp"
(subr nil)