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.
         |