nendo 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/bin/nendo +33 -2
- data/example/cgi/dekamoji.cgi +78 -43
- data/lib/debug/syslog.nnd +42 -0
- data/lib/debug/syslog.nndc +53 -0
- data/lib/init.nnd +61 -9
- data/lib/init.nndc +9674 -9037
- data/lib/nendo.rb +99 -10
- data/lib/text/html-lite.nnd +3 -2
- data/lib/text/html-lite.nndc +2864 -2357
- data/lib/text/tree.nnd +4 -2
- data/lib/text/tree.nndc +183 -177
- metadata +17 -6
data/lib/nendo.rb
CHANGED
@@ -1,11 +1,41 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# -*- encoding: utf-8 -*-
|
3
3
|
#
|
4
|
-
#
|
4
|
+
# nendo.rb - "language core of nendo"
|
5
5
|
#
|
6
|
-
#
|
6
|
+
# Copyright (c) 2000-2010 Kiyoka Nishiyama <kiyoka@sumibi.org>
|
7
|
+
#
|
8
|
+
# Redistribution and use in source and binary forms, with or without
|
9
|
+
# modification, are permitted provided that the following conditions
|
10
|
+
# are met:
|
11
|
+
#
|
12
|
+
# 1. Redistributions of source code must retain the above copyright
|
13
|
+
# notice, this list of conditions and the following disclaimer.
|
14
|
+
#
|
15
|
+
# 2. Redistributions in binary form must reproduce the above copyright
|
16
|
+
# notice, this list of conditions and the following disclaimer in the
|
17
|
+
# documentation and/or other materials provided with the distribution.
|
18
|
+
#
|
19
|
+
# 3. Neither the name of the authors nor the names of its contributors
|
20
|
+
# may be used to endorse or promote products derived from this
|
21
|
+
# software without specific prior written permission.
|
22
|
+
#
|
23
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
24
|
+
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
25
|
+
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
26
|
+
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
27
|
+
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
28
|
+
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
29
|
+
# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
30
|
+
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
31
|
+
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
32
|
+
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
33
|
+
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
34
|
+
#
|
35
|
+
# $Id:
|
7
36
|
#
|
8
37
|
require 'stringio'
|
38
|
+
#require 'profile'
|
9
39
|
|
10
40
|
class Nil
|
11
41
|
include Enumerable
|
@@ -903,6 +933,9 @@ module BuiltinFunctions
|
|
903
933
|
end
|
904
934
|
|
905
935
|
def _hash_MIMARKtable_MIMARKget( h, key, *args )
|
936
|
+
if !((key.is_a? String) or ( key.is_a? Symbol))
|
937
|
+
raise TypeError, "Error: argument key requires String or Symbol.\n"
|
938
|
+
end
|
906
939
|
if h.has_key?( key )
|
907
940
|
h[key]
|
908
941
|
else
|
@@ -916,11 +949,23 @@ module BuiltinFunctions
|
|
916
949
|
end
|
917
950
|
|
918
951
|
def _hash_MIMARKtable_MIMARKput_EXMARK( h, key, value )
|
952
|
+
if !((key.is_a? String) or ( key.is_a? Symbol))
|
953
|
+
raise TypeError, "Error: argument key requires String or Symbol.\n"
|
954
|
+
end
|
919
955
|
h[key] = value
|
920
956
|
end
|
921
957
|
|
922
|
-
|
923
|
-
|
958
|
+
# backtrace expects this format "filename:lineno: place message ". e.g. "init.nnd:10: in aaa macro.".
|
959
|
+
def _raise( exception, message, backtrace )
|
960
|
+
raise exception, message, [ backtrace ]
|
961
|
+
end
|
962
|
+
|
963
|
+
def __ASMARKLINE_ASMARK()
|
964
|
+
@lastLineno
|
965
|
+
end
|
966
|
+
|
967
|
+
def __ASMARKFILE_ASMARK()
|
968
|
+
@lastSourcefile
|
924
969
|
end
|
925
970
|
end
|
926
971
|
|
@@ -956,10 +1001,14 @@ class Evaluator
|
|
956
1001
|
}
|
957
1002
|
@char_table_ruby_to_lisp = @char_table_lisp_to_ruby.invert
|
958
1003
|
|
1004
|
+
# toplevel binding
|
1005
|
+
@global_lisp_binding = Hash.new
|
1006
|
+
|
959
1007
|
# built-in functions
|
960
1008
|
self.methods.grep( /^_/ ) { |rubySymbol|
|
961
1009
|
@___tmp = self.method( rubySymbol )
|
962
|
-
eval( sprintf( "@%s = @___tmp", rubySymbol ), @binding )
|
1010
|
+
eval( sprintf( "@%s = @___tmp;", rubySymbol ), @binding )
|
1011
|
+
eval( sprintf( "@global_lisp_binding['%s'] = true;", rubySymbol ), @binding )
|
963
1012
|
}
|
964
1013
|
|
965
1014
|
# initialize buildin functions as Proc objects
|
@@ -1101,7 +1150,12 @@ class Evaluator
|
|
1101
1150
|
ar = args.cdr.map { |x| x.car }
|
1102
1151
|
variable_sym = toRubySymbol( args.car.to_s.sub( /^:/, "" ))
|
1103
1152
|
global_cap = locals.flatten.include?( variable_sym.split( /[.]/ )[0] ) ? nil : "@"
|
1104
|
-
[
|
1153
|
+
[ "begin",
|
1154
|
+
[
|
1155
|
+
sprintf( "@global_lisp_binding['%s'] = true", variable_sym ),
|
1156
|
+
sprintf( "%s%s = ", global_cap, variable_sym ),
|
1157
|
+
ar ],
|
1158
|
+
"end" ]
|
1105
1159
|
when :error
|
1106
1160
|
[
|
1107
1161
|
'begin raise RuntimeError, ',
|
@@ -1318,7 +1372,7 @@ class Evaluator
|
|
1318
1372
|
end
|
1319
1373
|
if global_cap
|
1320
1374
|
["begin",
|
1321
|
-
[sprintf(
|
1375
|
+
[sprintf( "if @global_lisp_binding.has_key?('%s') then", variable_sym ),
|
1322
1376
|
expression,
|
1323
1377
|
sprintf( 'else raise NameError.new( "Error: undefined variable %s", "%s" ) end', variable_sym, variable_sym ),
|
1324
1378
|
sprintf( 'rescue => __e ; __e.set_backtrace( ["%s:%d"] + __e.backtrace ) ; raise __e', sourcefile, lineno )],
|
@@ -1493,11 +1547,43 @@ class Evaluator
|
|
1493
1547
|
@expand_flag = true
|
1494
1548
|
macroexpand_1_check( sexp )
|
1495
1549
|
end
|
1496
|
-
|
1550
|
+
|
1551
|
+
def macroexpand( sexp )
|
1552
|
+
case sexp
|
1553
|
+
when Cell
|
1554
|
+
if :quote == sexp.car
|
1555
|
+
sexp
|
1556
|
+
else
|
1557
|
+
sym = sexp.car.to_s
|
1558
|
+
sym = toRubySymbol( sym )
|
1559
|
+
newSexp = sexp
|
1560
|
+
if isRubyInterface( sym )
|
1561
|
+
# do nothing
|
1562
|
+
elsif sexp.car.class == Symbol and eval( sprintf( "(defined? @%s and LispMacro == @%s.class)", sym,sym ), @binding )
|
1563
|
+
eval( sprintf( "@__macro = @%s", sym ), @binding )
|
1564
|
+
newSexp = callProcedure( sym, @__macro, sexp.cdr )
|
1565
|
+
end
|
1566
|
+
if _equal_QUMARK( newSexp, sexp )
|
1567
|
+
sexp.map { |x|
|
1568
|
+
if x.car.is_a? Cell
|
1569
|
+
macroexpand( x.car )
|
1570
|
+
else
|
1571
|
+
x.car
|
1572
|
+
end
|
1573
|
+
}.to_list( sexp.lastAtom )
|
1574
|
+
else
|
1575
|
+
newSexp
|
1576
|
+
end
|
1577
|
+
end
|
1578
|
+
else
|
1579
|
+
sexp
|
1580
|
+
end
|
1581
|
+
end
|
1582
|
+
|
1497
1583
|
def lispCompile( sexp )
|
1498
1584
|
converge = true
|
1499
1585
|
begin
|
1500
|
-
newSexp =
|
1586
|
+
newSexp = macroexpand( sexp )
|
1501
1587
|
converge = _equal_QUMARK( newSexp, sexp )
|
1502
1588
|
sexp = newSexp
|
1503
1589
|
end until converge
|
@@ -1521,6 +1607,8 @@ class Evaluator
|
|
1521
1607
|
end
|
1522
1608
|
|
1523
1609
|
def lispEval( sexp, sourcefile, lineno )
|
1610
|
+
@lastSourcefile = sourcefile
|
1611
|
+
@lastLineno = lineno
|
1524
1612
|
sexp = lispCompile( sexp )
|
1525
1613
|
sexp = quoting( sexp );
|
1526
1614
|
if @debug
|
@@ -1533,7 +1621,7 @@ class Evaluator
|
|
1533
1621
|
end
|
1534
1622
|
@compiled_code[ sourcefile ] << rubyExp
|
1535
1623
|
printf( " rubyExp=<<<\n%s\n>>>\n", rubyExp ) if @debug
|
1536
|
-
eval( rubyExp, @binding,
|
1624
|
+
eval( rubyExp, @binding, @lastSourcefile, @lastLineno )
|
1537
1625
|
end
|
1538
1626
|
|
1539
1627
|
def _load( filename )
|
@@ -1551,6 +1639,7 @@ class Evaluator
|
|
1551
1639
|
end
|
1552
1640
|
end
|
1553
1641
|
}
|
1642
|
+
forward_gensym_counter()
|
1554
1643
|
end
|
1555
1644
|
|
1556
1645
|
def _load_MIMARKcompiled_MIMARKcode( filename )
|
data/lib/text/html-lite.nnd
CHANGED
@@ -1,5 +1,6 @@
|
|
1
|
+
;;-*- mode: nendo; syntax: scheme -*-;;
|
1
2
|
;;;
|
2
|
-
;;; html-lite.
|
3
|
+
;;; html-lite.nnd - lightweight HTML construction
|
3
4
|
;;;
|
4
5
|
;;; Copyright (c) 2000-2009 Shiro Kawai <shiro@acm.org>
|
5
6
|
;;;
|
@@ -30,7 +31,7 @@
|
|
30
31
|
;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
31
32
|
;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
32
33
|
;;;
|
33
|
-
;;; $Id:
|
34
|
+
;;; $Id:
|
34
35
|
;;;
|
35
36
|
;;;
|
36
37
|
;;; ported for Nendo language by Kiyoka Nishiyama.
|