-í
­¯T=c       s    d  Z    d k l Z  d k l Z l Z  d k l Z l Z  d k Z ( d e	 f d „  ƒ  YZ
 1 d e
 f d „  ƒ  YZ 7 d	 e
 f d
 „  ƒ  YZ ? d e f d „  ƒ  YZ R d e f d „  ƒ  YZ Y d e f d „  ƒ  YZ ^ d e f d „  ƒ  YZ r d e f d „  ƒ  YZ v d e f d „  ƒ  YZ † d e f d „  ƒ  YZ  d e f d „  ƒ  YZ œ d e f d „  ƒ  YZ ¨ d e f d „  ƒ  YZ ± d e f d  „  ƒ  YZ ½ d! e f d" „  ƒ  YZ Ä d# e f d$ „  ƒ  YZ Ò d% e f d& „  ƒ  YZ × d' e f d( „  ƒ  YZ Ü d) e f d* „  ƒ  YZ è g  i Z e ƒ  i  ƒ  Dè ][ Z! é e! i" e# j oB ê e$ e! e
 ƒ o+ ë e! i" e e f j o e e! ƒ n n n qI[ a% ï g  i Z t% Dï ]' Z! ð e& e! d+ ƒ o e e! ƒ n qÁ[ a' ò d, „  Z( d- „  Z) d S(.   sz  BLISP builtins

Architecture:
Every builtin is a class providing the instance method Call().
The two namespaces of builtin_macros and builtin_functiosn are created when the
client calls MakeBuiltins.  It's intended that it gets called when initializing an
interpreter instance.

The reason the builtins are function-objects instead of straight up Python functions
is because some functions, like defun, need external data to work.  Thus,
these special_builtins have constructors that take in arguments supplied by the client
calling MakeBuiltins.

If you add any new builtins, make sure to inherit either BuiltinMacro or BuiltinFunction!
It's important because I don't use a master list or table of all builtins; rather,
they're dynamically generated by looping through globals(), using superclases
as an informative trait.

This also means it's easy to add new builtins: you only have to write in just -- 1 --
place!  Just add another class in the middle section and it's good to go!

As a bonus, the inheritance system provides a nifty naming system to promote my
lazines; the interpreter will generate the lispnames for most functions for me!
(   s   division(   s   LispFunctions   EvalExpr(   s   copys   deepcopyNs   BuiltinAnythingc      s   ( ) d „  Z  - d „  Z RS(   Nc    s4   ) + t  |  i d ƒ o , |  i ƒ  |  _ n d  S(   Ns   lispname(   s   hasattrs   selfs	   __class__s   make_lispnames   lispname(   s   self(    (    s   builtins.pys   __init__) s   c    s&   - . |  i i i ƒ  i d d ƒ Sd  S(   Ns   _s   -(   s   selfs	   __class__s   __name__s   lowers   replace(   s   self(    (    s   builtins.pys   make_lispname- s   (   s   __init__s   make_lispname(    (    (    s   builtins.pys   BuiltinAnything( s   s   BuiltinFunctionc      s   1 d  Z  3 4 d „  Z RS(   s£   You have to do the Call _after_ recursively evaluating all everything in the 2nd -> last
    positions in the s-expr.  Once they're evalutaed, you've got lispargs.c    s   4 5 d |  GHd  S(   Ns   %s needs to implement Call()!(   s   self(   s   selfs   lispargs(    (    s   builtins.pys   Call4 s   (   s   __doc__s   Call(    (    (    s   builtins.pys   BuiltinFunction1 s   	s   BuiltinMacroc      s   7 d  Z  8 9 d „  Z RS(   s9   Macros get called without their arguments being evaluatedc    s   9 : d |  GHd  S(   Ns   %s needs to implement Call()!(   s   self(   s   selfs   lispargs(    (    s   builtins.pys   Call9 s   (   s   __doc__s   Call(    (    (    s   builtins.pys   BuiltinMacro7 s   	s   Evalc      s5   ? d  Z  F G d „  Z N d „  Z P e e ƒ Z RS(   sæ       Lisp usage:     (eval '(+ 1 2))
    Python usage:   Call( [['+', '1', '2']] )
                    << or rather, Eval.PyEval(['+', '1', '2']) >>
        not quoted becaues it's called AFTER EvalExpr'ing away the quote
    
    c    sW   G H t  o t | ƒ d j p t ‚ I | d } K t | ƒ } L t | h  ƒ Sd  S(   Ni   i    (   s	   __debug__s   lens   lispargss   AssertionErrors	   eval_thiss   deepcopys   eval_this_copys   EvalExpr(   s   selfs   lispargss	   eval_thiss   eval_this_copy(    (    s   builtins.pys   CallG s   $c    s    N O |  i |  ƒ  | g ƒ d  S(   N(   s   clss   Calls   lispexpr(   s   clss   lispexpr(    (    s   builtins.pys   PyEvalN s   (   s   __doc__s   Calls   PyEvals   classmethod(    (    (    s   builtins.pys   Eval? s   	s   Lambdac      s   R S d „  Z  RS(   Nc    sw   S T t  o t | ƒ d j p t ‚ U | d } t  o t | t ƒ p t ‚ V | d } W t | | d ƒ Sd  S(   Ni   i    i   s   Anonymous Lambda Function(	   s	   __debug__s   lens   lispargss   AssertionErrors   paramss
   isinstances   strs   evals_tos   LispFunction(   s   selfs   lispargss   paramss   evals_to(    (    s   builtins.pys   CallS s   $,(   s   Call(    (    (    s   builtins.pys   LambdaR s   s   Mapc      s   Y Z d „  Z  RS(   Nc    sm   Z [ t  o t | ƒ d j p t ‚ \ t | d i g  i } | d D\ ] } | | g ƒ qI ~ ƒ Sd  S(   Ni   i   i    (	   s	   __debug__s   lens   lispargss   AssertionErrors   maps   Calls   appends   _[1]s   itm(   s   selfs   lispargss   _[1]s   itm(    (    s   builtins.pys   CallZ s   $" (   s   Call(    (    (    s   builtins.pys   MapY s   s   Defunc      s)   ^ _ d f Z  ` d „  Z e d „  Z RS(   Ns   defined_fn_nsc    s&   ` b c t  i |  ƒ d | |  _ d S(   sN   Pass it the namespace dictionary where newly defined
        functions will goN(   s   BuiltinMacros   __init__s   selfs   fn_nss   defined_functions(   s   selfs   fn_ns(    (    s   builtins.pys   __init__` s   c    sÙ   e f t  o t | ƒ d j p t ‚ g | d } t  o t | t ƒ p t ‚ h | d } t  o t | t ƒ p t ‚ i | d } j | |  i
 j o k t d | ‚ n n t | | | ƒ |  i
 | <o d Sd  S(   Ni   i    i   i   s3   defun error: Function with name '%s' already exists(   s	   __debug__s   lens   lispargss   AssertionErrors   names
   isinstances   strs   paramss   evals_tos   selfs   defined_functionss   LispExeptions   LispFunction(   s   selfs   lispargss   paramss   names   evals_to(    (    s   builtins.pys   Calle s   $+,(   s   needed_external_datas   __init__s   Call(    (    (    s   builtins.pys   Defun^ s   s   Quotec      s   r s d „  Z  RS(   Nc    s   s t | d Sd  S(   Ni    (   s   lispargs(   s   selfs   lispargs(    (    s   builtins.pys   Calls s   (   s   Call(    (    (    s   builtins.pys   Quoter s   s   Ifc      s   v d  Z  w x d „  Z RS(   s   Doesnt ayet workc    sý   x y t  o  t | ƒ d d f j p t ‚ z | d  \ } } { t | ƒ d j o { | d } n | t i d ƒ } } t	 i
 | d ƒ } ~ | d d f j o  t	 i
 | ƒ SnA € | d d d	 f j o  t	 i
 | ƒ Sn ƒ d
 | GH„ d Sd  S(   Ni   i   s   (quote NIL)i    s   ts   Ts   nils   NILs   NilsJ   if: Oops! Instead of T or NIL, got '%s'!  Returning NIL for the hell of it(   s	   __debug__s   lens   lispargss   AssertionErrors   tests   ontrues   onfalses   Parsers   ParseStrings   Evals   PyEvals
   testresult(   s   selfs   lispargss   onfalses
   testresults   tests   ontrue(    (    s   builtins.pys   Callx s   * (   s   __doc__s   Call(    (    (    s   builtins.pys   Ifv s   	s   Notc      s   † ‡ d „  Z  RS(   Nc    sh   ‡ ˆ | d d d f j o ‰ d Sn Š | d d d d f j o ‹ d Sn Œ t d | d ‚ d  S(   Ni    s   ts   Ts   NILs   nils   Nils   %s neither true nor false value(   s   lispargss   LispException(   s   selfs   lispargs(    (    s   builtins.pys   Call‡ s
   (   s   Call(    (    (    s   builtins.pys   Not† s   s   Addc      s&    ‘ d Z  ’ d „  Z ” d „  Z RS(   Ns   +c    s   ’ “ t  i |  ƒ d  S(   N(   s   BuiltinFunctions   __init__s   self(   s   self(    (    s   builtins.pys   __init__’ s   c    s¦   ” • t  o t | ƒ d j p t ‚ – x5 | D– ]* } – t  o t | t ƒ p
 t | ‚ q1 W— d } ˜ x$ | D˜ ] } ™ | t	 | ƒ 7} qu Wš t | ƒ Sd  S(   Ni   i    (
   s	   __debug__s   lens   lispargss   AssertionErrors   es
   isinstances   strs   numeric_sums   str_nums   int(   s   selfs   lispargss   es   numeric_sums   str_num(    (    s   builtins.pys   Call” s   $
 	 (	
 	(   s   lispnames   __init__s   Call(    (    (    s   builtins.pys   Add s   	s   Multc      s&   œ  d Z  ž d „  Z   d „  Z RS(   Ns   *c    s   ž Ÿ t  i |  ƒ d  S(   N(   s   BuiltinFunctions   __init__s   self(   s   self(    (    s   builtins.pys   __init__ž s   c    s¦     ¡ t  o t | ƒ d j p t ‚ ¢ x5 | D¢ ]* } ¢ t  o t | t ƒ p
 t | ‚ q1 W£ d } ¤ x$ | D¤ ] } ¥ | t	 | ƒ 9} qu W¦ t | ƒ Sd  S(   Ni   (
   s	   __debug__s   lens   lispargss   AssertionErrors   es
   isinstances   strs   numeric_prods   str_nums   int(   s   selfs   lispargss   es   str_nums   numeric_prod(    (    s   builtins.pys   Call  s   $
 	 (	
 	(   s   lispnames   __init__s   Call(    (    (    s   builtins.pys   Multœ s   	s   Dividec      s&   ¨ © d Z  ª d „  Z ¬ d „  Z RS(   Ns   /c    s   ª « t  i |  ƒ d  S(   N(   s   BuiltinFunctions   __init__s   self(   s   self(    (    s   builtins.pys   __init__ª s   c    s‹   ¬ ­ t  o t | ƒ d j p t ‚ ® x5 | D® ]* } ® t  o t | t ƒ p
 t | ‚ q1 W¯ t t | d ƒ t | d ƒ ƒ Sd  S(   Ni   i    i   (   s	   __debug__s   lens   lispargss   AssertionErrors   es
   isinstances   strs   int(   s   selfs   lispargss   e(    (    s   builtins.pys   Call¬ s
   $
 	 ((   s   lispnames   __init__s   Call(    (    (    s   builtins.pys   Divide¨ s   	s   Subtractc      s&   ± ² d Z  ³ d „  Z µ d „  Z RS(   Ns   -c    s   ³ ´ t  i |  ƒ d  S(   N(   s   BuiltinFunctions   __init__s   self(   s   self(    (    s   builtins.pys   __init__³ s   c    s´   µ ¶ t  o t | ƒ d j p t ‚ · x5 | D· ]* } · t  o t | t ƒ p
 t | ‚ q1 W¸ t | d ƒ } ¹ x( | d D¹ ] } º | t | ƒ 8} qƒ W» t | ƒ Sd  S(   Ni   i    (
   s	   __debug__s   lens   lispargss   AssertionErrors   es
   isinstances   strs   ints   numeric_sums   str_num(   s   selfs   lispargss   es   numeric_sums   str_num(    (    s   builtins.pys   Callµ s   $
 	 ( 	(   s   lispnames   __init__s   Call(    (    (    s   builtins.pys   Subtract± s   	s   Moduloc      s   ½ ¾ d Z  ¿ d „  Z RS(   Ns   %c    sP   ¿ À t  o t | ƒ d j p t ‚ Á t t | d ƒ t | d ƒ ƒ Sd  S(   Ni   i    i   (   s	   __debug__s   lens   lispargss   AssertionErrors   strs   int(   s   selfs   lispargs(    (    s   builtins.pys   Call¿ s   $(   s   lispnames   Call(    (    (    s   builtins.pys   Modulo½ s   	s   Setoptc      s)   Ä Å d f Z  Æ d „  Z É d „  Z RS(   Ns   interperc    s#   Æ Ç t  i |  ƒ È | |  _ d  S(   N(   s   BuiltinMacros   __init__s   selfs   interper(   s   selfs   interper(    (    s   builtins.pys   __init__Æ s   c    st   É Ê | d  \ } } Ë | d j oJ Ì | d j o Ì d |  i _ n$ Í | d j o Í d |  i _ n n d  S(   Ni   s   debugs   oni   s   offi    (   s   lispargss   options   newvals   selfs   interpers   DEBUG(   s   selfs   lispargss   newvals   option(    (    s   builtins.pys   CallÉ s     (   s   needed_external_datas   __init__s   Call(    (    (    s   builtins.pys   SetoptÄ s   s   Consc      s   Ò Ó d „  Z  RS(   Nc    sA   Ó Ô t  o t | ƒ d j p t ‚ Õ | d g | d Sd  S(   Ni   i    i   (   s	   __debug__s   lens   lispargss   AssertionError(   s   selfs   lispargs(    (    s   builtins.pys   CallÓ s   $(   s   Call(    (    (    s   builtins.pys   ConsÒ s   s   Cdrc      s   × Ø d „  Z  RS(   Nc    s:   Ø Ù t  o t | ƒ d j p t ‚ Ú | d d Sd  S(   Ni   i    (   s	   __debug__s   lens   lispargss   AssertionError(   s   selfs   lispargs(    (    s   builtins.pys   CallØ s   $(   s   Call(    (    (    s   builtins.pys   Cdr× s   s   Carc      s   Ü Ý d „  Z  RS(   Nc    s:   Ý Þ t  o t | ƒ d j p t ‚ ß | d d Sd  S(   Ni   i    (   s	   __debug__s   lens   lispargss   AssertionError(   s   selfs   lispargs(    (    s   builtins.pys   CallÝ s   $(   s   Call(    (    (    s   builtins.pys   CarÜ s   s   needed_external_datac     sÏ   ò ó ô h  h  f \ } } ö x t Dö ]’ } ÷ | t j o ø t | |  ƒ } n
 ù g  } û | | Œ  } ü t	 | t
 ƒ o ý | | | i <n( þ t	 | t ƒ o ÿ | | | i <n q% W| | f Sd  S(   N(   s   builtin_fnss   builtin_macross   all_builtinss   BuiltinClasss   special_builtinss   ArgsForSpecialCases   external_datas   argss   new_builtins
   issubclasss   BuiltinFunctions   lispnames   BuiltinMacro(   s   external_datas   argss   new_builtins   BuiltinClasss   builtin_fnss   builtin_macros(    (    s   builtins.pys   MakeBuiltinsò s   
 		c    s9   g  i  } |  i D] } | | | ƒ q ~ Sd  S(   N(   s   appends   _[1]s   Builtins   needed_external_datas	   data_names   external_data(   s   Builtins   external_datas   _[1]s	   data_name(    (    s   builtins.pys   ArgsForSpecialCases    (*   s   __doc__s
   __future__s   divisions   evallers   LispFunctions   EvalExprs   copys   deepcopys   Parsers   objects   BuiltinAnythings   BuiltinFunctions   BuiltinMacros   Evals   Lambdas   Maps   Defuns   Quotes   Ifs   Nots   Adds   Mults   Divides   Subtracts   Modulos   Setopts   Conss   Cdrs   Cars   appends   _[1]s   globalss   valuess   Bs	   __class__s   types
   issubclasss   all_builtinss   hasattrs   special_builtinss   MakeBuiltinss   ArgsForSpecialCase(   s   divisions   MakeBuiltinss   BuiltinMacros   Cdrs   ArgsForSpecialCases   Cars   BuiltinFunctions   Defuns   LispFunctions   Adds   Conss   deepcopys   copys   Lambdas   Maps   EvalExprs   Modulos   Divides   Quotes   Parsers   BuiltinAnythings   _[1]s   Evals   Nots   Setopts   Bs   Subtracts   Mults   If(    (    s   builtins.pys   ? sB   	
	 	8 	*
