nendo 0.3.4 → 0.3.5

Sign up to get free protection for your applications and to get access to all the features.
data/lib/nendo.rb CHANGED
@@ -38,7 +38,6 @@
38
38
  module Nendo
39
39
  require 'stringio'
40
40
  require 'digest/sha1'
41
- #require 'profile'
42
41
 
43
42
  class Nil
44
43
  include Enumerable
@@ -232,12 +231,13 @@ module Nendo
232
231
  end
233
232
 
234
233
  class DelayedCallPacket
235
- def initialize( _origname, _pred, _args )
234
+ def initialize( _origname, _rubysym, _pred, _args )
236
235
  @origname = _origname
236
+ @rubysym = _rubysym
237
237
  @pred = _pred
238
238
  @args = _args
239
239
  end
240
- attr_reader :origname, :pred, :args
240
+ attr_reader :origname, :rubysym, :pred, :args
241
241
  end
242
242
 
243
243
  class Token
@@ -821,7 +821,9 @@ module Nendo
821
821
  end
822
822
 
823
823
  def _equal_QUMARK( a, b )
824
- if a.class != b.class
824
+ if a.is_a? String and b.is_a? String
825
+ a === b
826
+ elsif a.class != b.class
825
827
  false
826
828
  elsif a.class == Cell
827
829
  if a.isNull and b.isNull
@@ -845,7 +847,8 @@ module Nendo
845
847
  __assertFlat( arr )
846
848
  arr.each { |x|
847
849
  if not (_number_QUMARK(x) or _string_QUMARK(x))
848
- raise TypeError
850
+ ##arr.each { |v| STDERR.printf( "__PLMARK: %s\n", v ) }
851
+ raise TypeError, sprintf( "Error: arg %s is [%s] type",x ,x.class )
849
852
  end
850
853
  }
851
854
  case args[0].length
@@ -1029,7 +1032,6 @@ module Nendo
1029
1032
  def __GTMARK_EQMARK( a,b ) a >= b end
1030
1033
  def __LTMARK( a,b ) a < b end
1031
1034
  def __LTMARK_EQMARK( a,b ) a <= b end
1032
- def _eqv_QUMARK( a,b ) a === b end
1033
1035
  def _eq_QUMARK( a,b ) a == b end
1034
1036
  def _gt_QUMARK( a,b ) a > b end
1035
1037
  def _ge_QUMARK( a,b ) a >= b end
@@ -1063,7 +1065,7 @@ module Nendo
1063
1065
  end
1064
1066
  def _integer_QUMARK( arg ) arg.is_a? Integer end
1065
1067
  def _number_QUMARK( arg ) arg.is_a? Numeric end
1066
- def _string_QUMARK( arg ) String == arg.class end
1068
+ def _string_QUMARK( arg ) arg.is_a? String end
1067
1069
  def _macroexpand_MIMARK1( arg )
1068
1070
  if _pair_QUMARK( arg )
1069
1071
  macroexpandInit( 1 )
@@ -1106,7 +1108,7 @@ module Nendo
1106
1108
  arr = args[0].to_arr
1107
1109
  if 0 < arr.length
1108
1110
  if not arr[0].is_a? String
1109
- raise TypeError, "Error string-join's expects delimitter as String."
1111
+ raise TypeError, "Error: string-join's expects delimitter as String."
1110
1112
  else
1111
1113
  lst.to_a.map{ |x| x.car }.join( arr[0] )
1112
1114
  end
@@ -1118,6 +1120,16 @@ module Nendo
1118
1120
  require( arg )
1119
1121
  false
1120
1122
  end
1123
+ def _read_MIMARKfrom_MIMARKstring( str )
1124
+ if not str.is_a? String
1125
+ raise TypeError, "Error: read-from-string expects sexp as String."
1126
+ else
1127
+ sio = StringIO.open( str )
1128
+ reader = Reader.new( sio, "(string)", false )
1129
+ s = reader._read
1130
+ s[0]
1131
+ end
1132
+ end
1121
1133
  def _read( *args )
1122
1134
  lst = args[0].to_arr
1123
1135
  io = if 0 == lst.length
@@ -1139,7 +1151,7 @@ module Nendo
1139
1151
  end
1140
1152
 
1141
1153
  def _apply1( first, arg )
1142
- trampCall( callProcedure( "(apply1 genereate func)", first, arg ))
1154
+ trampCall( callProcedure( "(apply1 genereate func)", first, arg.to_arr ))
1143
1155
  end
1144
1156
 
1145
1157
  def _global_MIMARKvariables
@@ -1418,11 +1430,11 @@ module Nendo
1418
1430
  raise ArgumentError, argument_error_message if 0 != args.length
1419
1431
  []
1420
1432
  elsif 0 < num
1421
- if args.isNull
1433
+ if 0 == args.length
1422
1434
  [ Nil.new ]
1423
1435
  else
1424
1436
  raise ArgumentError, argument_error_message if num != args.length
1425
- args.map { |x| x.car }
1437
+ args
1426
1438
  end
1427
1439
  else
1428
1440
  num = num.abs( )-1
@@ -1431,9 +1443,9 @@ module Nendo
1431
1443
  rest = []
1432
1444
  args.each_with_index { |x,i|
1433
1445
  if i < num
1434
- params << x.car
1446
+ params << x
1435
1447
  else
1436
- rest << x.car
1448
+ rest << x
1437
1449
  end
1438
1450
  }
1439
1451
  result = []
@@ -1451,17 +1463,15 @@ module Nendo
1451
1463
 
1452
1464
  def trampCall( result )
1453
1465
  while result.is_a? DelayedCallPacket
1454
- method_name = toRubySymbol( result.origname ) + "_METHOD"
1455
1466
  @tmp_origname = result.origname
1456
1467
  @tmp_pred = result.pred
1457
1468
  @tmp_args = result.args
1458
- result = eval( sprintf( "self.%s( @tmp_origname, @tmp_pred, @tmp_args )", method_name ), @binding )
1469
+ result = eval( sprintf( "self.%s( @tmp_origname, @tmp_pred, @tmp_args )", result.rubysym + "_METHOD" ), @binding )
1459
1470
  end
1460
1471
  result
1461
1472
  end
1462
1473
 
1463
1474
  def method_missing( name, *args )
1464
- sym = toRubySymbol( name )
1465
1475
  if @global_lisp_binding[name].is_a? Proc
1466
1476
  @global_lisp_binding[name].call( args[0], args[1], args[2] )
1467
1477
  else
@@ -1469,12 +1479,12 @@ module Nendo
1469
1479
  end
1470
1480
  end
1471
1481
 
1472
- def delayCall( origname, pred, args )
1482
+ def delayCall( rubysym, origname, pred, args )
1473
1483
  case @optimize_level
1474
1484
  when 0 # no optimize
1475
1485
  callProcedure( origname, pred, args )
1476
1486
  else # tail call optimization
1477
- DelayedCallPacket.new( origname, pred, args )
1487
+ DelayedCallPacket.new( origname, rubysym, pred, args )
1478
1488
  end
1479
1489
  end
1480
1490
 
@@ -1537,17 +1547,12 @@ module Nendo
1537
1547
  lispSymbolReference( toRubySymbol( funcname ), locals, translatedArr, sourcefile, lineno )
1538
1548
  else
1539
1549
  # Nendo function
1540
- if 0 == args.length
1541
- arr = [ "Cell.new(" ]
1542
- else
1543
- arr = separateWith( args.map.with_index { |x,i| x.car }, ",Cell.new(" )
1544
- arr[0].unshift( "Cell.new(" )
1545
- end
1550
+ arr = separateWith( args.map { |x| x.car }, "," )
1546
1551
  if EXEC_TYPE_ANONYMOUS == execType
1547
1552
  [sprintf( "trampCall( callProcedure( 'anonymouse', " ),
1548
1553
  [ funcname ] + [ "," ],
1549
- arr,
1550
- sprintf( " ))" ) + arr.map { |n| ")" }.join]
1554
+ "[", arr, "]",
1555
+ " ))"]
1551
1556
  else
1552
1557
  origname = funcname.to_s
1553
1558
  funcname = funcname.to_s
@@ -1555,17 +1560,17 @@ module Nendo
1555
1560
  _call = case execType
1556
1561
  when EXEC_TYPE_NORMAL
1557
1562
  if locals.flatten.include?( sym )
1558
- [ sprintf( "trampCall( callProcedure( ", sym ), "))" ] # local function
1563
+ [ "trampCall( callProcedure( ", "))" ] # local function
1559
1564
  else
1560
1565
  [ sprintf( "trampCall( self.%s_METHOD( ", sym ), "))" ] # toplevel function
1561
1566
  end
1562
1567
  when EXEC_TYPE_TAILCALL
1563
- [ "delayCall(", ")" ]
1568
+ [ sprintf( "delayCall( '%s', ", sym ), ")" ]
1564
1569
  end
1565
1570
  [sprintf( "%s '%s',", _call[0], origname ),
1566
1571
  [lispSymbolReference( sym, locals, nil, sourcefile, lineno )] + [","],
1567
- arr,
1568
- sprintf( " %s", _call[1] ) + arr.map { |n| ")" }.join]
1572
+ "[", arr, "]",
1573
+ sprintf( " %s", _call[1] )]
1569
1574
  end
1570
1575
  end
1571
1576
  end
@@ -1730,6 +1735,8 @@ module Nendo
1730
1735
  str += sprintf( "LispKeyword.new( \"%s\" )", sexp.key.to_s )
1731
1736
  when TrueClass, FalseClass, NilClass # reserved symbols
1732
1737
  str += toRubyValue( sexp )
1738
+ when Nil
1739
+ str += "Cell.new()"
1733
1740
  else
1734
1741
  str += sprintf( "%s", sexp )
1735
1742
  end
@@ -1774,7 +1781,7 @@ module Nendo
1774
1781
  "end"]
1775
1782
  end
1776
1783
  end
1777
-
1784
+
1778
1785
  # Lisp->Ruby translater
1779
1786
  # - locals is array of closure's local variable list
1780
1787
  # when S-expression is
@@ -1923,7 +1930,7 @@ module Nendo
1923
1930
  sexp
1924
1931
  elsif sexp.car.class == Symbol and eval( sprintf( "(defined? @%s and LispMacro == @%s.class)", sym,sym ), @binding )
1925
1932
  eval( sprintf( "@__macro = @%s", sym ), @binding )
1926
- newSexp = trampCall( callProcedure( sym, @__macro, sexp.cdr ))
1933
+ newSexp = trampCall( callProcedure( sym, @__macro, sexp.cdr.to_arr ))
1927
1934
  end
1928
1935
  if _equal_QUMARK( newSexp, sexp )
1929
1936
  sexp.map { |x|
@@ -1988,7 +1995,7 @@ module Nendo
1988
1995
  sym = toRubySymbol( "%compile-phase" )
1989
1996
  if ( eval( sprintf( "(defined? @%s and Proc == @%s.class)", sym,sym ), @binding ))
1990
1997
  eval( sprintf( "@___tmp = @%s", sym ), @binding )
1991
- sexp = trampCall( callProcedure( sym, @___tmp, Cell.new( sexp )))
1998
+ sexp = trampCall( callProcedure( sym, @___tmp, [ sexp ]))
1992
1999
  if @debug
1993
2000
  printf( "\n compiled=<<< %s >>>\n", (Printer.new())._print(sexp))
1994
2001
  end
@@ -2107,7 +2114,7 @@ module Nendo
2107
2114
 
2108
2115
  argsStr = (1..(pred.arity)).map { |n| "arg" + n.to_s }.join( "," )
2109
2116
  str = [ "def self." + origname + "(" + argsStr + ")",
2110
- sprintf( " trampCall( callProcedure( '%s', @_%s, [ " + argsStr + " ].to_list )) ",
2117
+ sprintf( " trampCall( callProcedure( '%s', @_%s, [ " + argsStr + " ] )) ",
2111
2118
  origname, origname ),
2112
2119
  "end ;",
2113
2120
  "def @core." + origname + "(" + argsStr + ")",