adding (for lo hi f) construct, changing library funcs to use it
setting license to CPL v1
This commit is contained in:
		
							parent
							
								
									60644c760e
								
							
						
					
					
						commit
						e08091e4a1
					
				| 
						 | 
					@ -0,0 +1,214 @@
 | 
				
			||||||
 | 
					Common Public License Version 1.0
 | 
				
			||||||
 | 
					Fri, 2007-06-01 17:16 — nelson
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC
 | 
				
			||||||
 | 
					LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM
 | 
				
			||||||
 | 
					CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1. DEFINITIONS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"Contribution" means:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					a) in the case of the initial Contributor, the initial code and
 | 
				
			||||||
 | 
					documentation distributed under this Agreement, and
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					b) in the case of each subsequent Contributor:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					i) changes to the Program, and
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ii) additions to the Program;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					where such changes and/or additions to the Program originate from and are
 | 
				
			||||||
 | 
					distributed by that particular Contributor. A Contribution 'originates' from a
 | 
				
			||||||
 | 
					Contributor if it was added to the Program by such Contributor itself or anyone
 | 
				
			||||||
 | 
					acting on such Contributor's behalf. Contributions do not include additions to
 | 
				
			||||||
 | 
					the Program which: (i) are separate modules of software distributed in
 | 
				
			||||||
 | 
					conjunction with the Program under their own license agreement, and (ii) are not
 | 
				
			||||||
 | 
					derivative works of the Program.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"Contributor" means any person or entity that distributes the Program.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"Licensed Patents" mean patent claims licensable by a Contributor which are
 | 
				
			||||||
 | 
					necessarily infringed by the use or sale of its Contribution alone or when
 | 
				
			||||||
 | 
					combined with the Program.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"Program" means the Contributions distributed in accordance with this Agreement.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"Recipient" means anyone who receives the Program under this Agreement,
 | 
				
			||||||
 | 
					including all Contributors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					2. GRANT OF RIGHTS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					a) Subject to the terms of this Agreement, each Contributor hereby grants
 | 
				
			||||||
 | 
					Recipient a non-exclusive, worldwide, royalty-free copyright license to
 | 
				
			||||||
 | 
					reproduce, prepare derivative works of, publicly display, publicly perform,
 | 
				
			||||||
 | 
					distribute and sublicense the Contribution of such Contributor, if any, and such
 | 
				
			||||||
 | 
					derivative works, in source code and object code form.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					b) Subject to the terms of this Agreement, each Contributor hereby grants
 | 
				
			||||||
 | 
					Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed
 | 
				
			||||||
 | 
					Patents to make, use, sell, offer to sell, import and otherwise transfer the
 | 
				
			||||||
 | 
					Contribution of such Contributor, if any, in source code and object code form.
 | 
				
			||||||
 | 
					This patent license shall apply to the combination of the Contribution and the
 | 
				
			||||||
 | 
					Program if, at the time the Contribution is added by the Contributor, such
 | 
				
			||||||
 | 
					addition of the Contribution causes such combination to be covered by the
 | 
				
			||||||
 | 
					Licensed Patents. The patent license shall not apply to any other combinations
 | 
				
			||||||
 | 
					which include the Contribution. No hardware per se is licensed hereunder.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					c) Recipient understands that although each Contributor grants the licenses
 | 
				
			||||||
 | 
					to its Contributions set forth herein, no assurances are provided by any
 | 
				
			||||||
 | 
					Contributor that the Program does not infringe the patent or other intellectual
 | 
				
			||||||
 | 
					property rights of any other entity. Each Contributor disclaims any liability to
 | 
				
			||||||
 | 
					Recipient for claims brought by any other entity based on infringement of
 | 
				
			||||||
 | 
					intellectual property rights or otherwise. As a condition to exercising the
 | 
				
			||||||
 | 
					rights and licenses granted hereunder, each Recipient hereby assumes sole
 | 
				
			||||||
 | 
					responsibility to secure any other intellectual property rights needed, if any.
 | 
				
			||||||
 | 
					For example, if a third party patent license is required to allow Recipient to
 | 
				
			||||||
 | 
					distribute the Program, it is Recipient's responsibility to acquire that license
 | 
				
			||||||
 | 
					before distributing the Program.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					d) Each Contributor represents that to its knowledge it has sufficient
 | 
				
			||||||
 | 
					copyright rights in its Contribution, if any, to grant the copyright license set
 | 
				
			||||||
 | 
					forth in this Agreement.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					3. REQUIREMENTS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A Contributor may choose to distribute the Program in object code form under its
 | 
				
			||||||
 | 
					own license agreement, provided that:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					a) it complies with the terms and conditions of this Agreement; and
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					b) its license agreement:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					i) effectively disclaims on behalf of all Contributors all warranties and
 | 
				
			||||||
 | 
					conditions, express and implied, including warranties or conditions of title and
 | 
				
			||||||
 | 
					non-infringement, and implied warranties or conditions of merchantability and
 | 
				
			||||||
 | 
					fitness for a particular purpose;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ii) effectively excludes on behalf of all Contributors all liability for
 | 
				
			||||||
 | 
					damages, including direct, indirect, special, incidental and consequential
 | 
				
			||||||
 | 
					damages, such as lost profits;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					iii) states that any provisions which differ from this Agreement are offered
 | 
				
			||||||
 | 
					by that Contributor alone and not by any other party; and
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					iv) states that source code for the Program is available from such
 | 
				
			||||||
 | 
					Contributor, and informs licensees how to obtain it in a reasonable manner on or
 | 
				
			||||||
 | 
					through a medium customarily used for software exchange.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					When the Program is made available in source code form:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					a) it must be made available under this Agreement; and
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					b) a copy of this Agreement must be included with each copy of the Program.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Contributors may not remove or alter any copyright notices contained within the
 | 
				
			||||||
 | 
					Program.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Each Contributor must identify itself as the originator of its Contribution, if
 | 
				
			||||||
 | 
					any, in a manner that reasonably allows subsequent Recipients to identify the
 | 
				
			||||||
 | 
					originator of the Contribution.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					4. COMMERCIAL DISTRIBUTION
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Commercial distributors of software may accept certain responsibilities with
 | 
				
			||||||
 | 
					respect to end users, business partners and the like. While this license is
 | 
				
			||||||
 | 
					intended to facilitate the commercial use of the Program, the Contributor who
 | 
				
			||||||
 | 
					includes the Program in a commercial product offering should do so in a manner
 | 
				
			||||||
 | 
					which does not create potential liability for other Contributors. Therefore, if
 | 
				
			||||||
 | 
					a Contributor includes the Program in a commercial product offering, such
 | 
				
			||||||
 | 
					Contributor ("Commercial Contributor") hereby agrees to defend and indemnify
 | 
				
			||||||
 | 
					every other Contributor ("Indemnified Contributor") against any losses, damages
 | 
				
			||||||
 | 
					and costs (collectively "Losses") arising from claims, lawsuits and other legal
 | 
				
			||||||
 | 
					actions brought by a third party against the Indemnified Contributor to the
 | 
				
			||||||
 | 
					extent caused by the acts or omissions of such Commercial Contributor in
 | 
				
			||||||
 | 
					connection with its distribution of the Program in a commercial product
 | 
				
			||||||
 | 
					offering. The obligations in this section do not apply to any claims or Losses
 | 
				
			||||||
 | 
					relating to any actual or alleged intellectual property infringement. In order
 | 
				
			||||||
 | 
					to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
 | 
				
			||||||
 | 
					Contributor in writing of such claim, and b) allow the Commercial Contributor to
 | 
				
			||||||
 | 
					control, and cooperate with the Commercial Contributor in, the defense and any
 | 
				
			||||||
 | 
					related settlement negotiations. The Indemnified Contributor may participate in
 | 
				
			||||||
 | 
					any such claim at its own expense.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					For example, a Contributor might include the Program in a commercial product
 | 
				
			||||||
 | 
					offering, Product X. That Contributor is then a Commercial Contributor. If that
 | 
				
			||||||
 | 
					Commercial Contributor then makes performance claims, or offers warranties
 | 
				
			||||||
 | 
					related to Product X, those performance claims and warranties are such
 | 
				
			||||||
 | 
					Commercial Contributor's responsibility alone. Under this section, the
 | 
				
			||||||
 | 
					Commercial Contributor would have to defend claims against the other
 | 
				
			||||||
 | 
					Contributors related to those performance claims and warranties, and if a court
 | 
				
			||||||
 | 
					requires any other Contributor to pay any damages as a result, the Commercial
 | 
				
			||||||
 | 
					Contributor must pay those damages.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					5. NO WARRANTY
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN
 | 
				
			||||||
 | 
					"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR
 | 
				
			||||||
 | 
					IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE,
 | 
				
			||||||
 | 
					NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each
 | 
				
			||||||
 | 
					Recipient is solely responsible for determining the appropriateness of using and
 | 
				
			||||||
 | 
					distributing the Program and assumes all risks associated with its exercise of
 | 
				
			||||||
 | 
					rights under this Agreement, including but not limited to the risks and costs of
 | 
				
			||||||
 | 
					program errors, compliance with applicable laws, damage to or loss of data,
 | 
				
			||||||
 | 
					programs or equipment, and unavailability or interruption of operations.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					6. DISCLAIMER OF LIABILITY
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY
 | 
				
			||||||
 | 
					CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
				
			||||||
 | 
					SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST
 | 
				
			||||||
 | 
					PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 | 
				
			||||||
 | 
					STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 | 
				
			||||||
 | 
					OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS
 | 
				
			||||||
 | 
					GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					7. GENERAL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If any provision of this Agreement is invalid or unenforceable under applicable
 | 
				
			||||||
 | 
					law, it shall not affect the validity or enforceability of the remainder of the
 | 
				
			||||||
 | 
					terms of this Agreement, and without further action by the parties hereto, such
 | 
				
			||||||
 | 
					provision shall be reformed to the minimum extent necessary to make such
 | 
				
			||||||
 | 
					provision valid and enforceable.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If Recipient institutes patent litigation against a Contributor with respect to
 | 
				
			||||||
 | 
					a patent applicable to software (including a cross-claim or counterclaim in a
 | 
				
			||||||
 | 
					lawsuit), then any patent licenses granted by that Contributor to such Recipient
 | 
				
			||||||
 | 
					under this Agreement shall terminate as of the date such litigation is filed. In
 | 
				
			||||||
 | 
					addition, if Recipient institutes patent litigation against any entity
 | 
				
			||||||
 | 
					(including a cross-claim or counterclaim in a lawsuit) alleging that the Program
 | 
				
			||||||
 | 
					itself (excluding combinations of the Program with other software or hardware)
 | 
				
			||||||
 | 
					infringes such Recipient's patent(s), then such Recipient's rights granted under
 | 
				
			||||||
 | 
					Section 2(b) shall terminate as of the date such litigation is filed.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					All Recipient's rights under this Agreement shall terminate if it fails to
 | 
				
			||||||
 | 
					comply with any of the material terms or conditions of this Agreement and does
 | 
				
			||||||
 | 
					not cure such failure in a reasonable period of time after becoming aware of
 | 
				
			||||||
 | 
					such noncompliance. If all Recipient's rights under this Agreement terminate,
 | 
				
			||||||
 | 
					Recipient agrees to cease use and distribution of the Program as soon as
 | 
				
			||||||
 | 
					reasonably practicable. However, Recipient's obligations under this Agreement
 | 
				
			||||||
 | 
					and any licenses granted by Recipient relating to the Program shall continue and
 | 
				
			||||||
 | 
					survive.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Everyone is permitted to copy and distribute copies of this Agreement, but in
 | 
				
			||||||
 | 
					order to avoid inconsistency the Agreement is copyrighted and may only be
 | 
				
			||||||
 | 
					modified in the following manner. The Agreement Steward reserves the right to
 | 
				
			||||||
 | 
					publish new versions (including revisions) of this Agreement from time to time.
 | 
				
			||||||
 | 
					No one other than the Agreement Steward has the right to modify this Agreement.
 | 
				
			||||||
 | 
					IBM is the initial Agreement Steward. IBM may assign the responsibility to serve
 | 
				
			||||||
 | 
					as the Agreement Steward to a suitable separate entity. Each new version of the
 | 
				
			||||||
 | 
					Agreement will be given a distinguishing version number. The Program (including
 | 
				
			||||||
 | 
					Contributions) may always be distributed subject to the version of the Agreement
 | 
				
			||||||
 | 
					under which it was received. In addition, after a new version of the Agreement
 | 
				
			||||||
 | 
					is published, Contributor may elect to distribute the Program (including its
 | 
				
			||||||
 | 
					Contributions) under the new version. Except as expressly stated in Sections
 | 
				
			||||||
 | 
					2(a) and 2(b) above, Recipient receives no rights or licenses to the
 | 
				
			||||||
 | 
					intellectual property of any Contributor under this Agreement, whether
 | 
				
			||||||
 | 
					expressly, by implication, estoppel or otherwise. All rights in the Program not
 | 
				
			||||||
 | 
					expressly granted under this Agreement are reserved.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This Agreement is governed by the laws of the State of New York and the
 | 
				
			||||||
 | 
					intellectual property laws of the United States of America. No party to this
 | 
				
			||||||
 | 
					Agreement will bring a legal action under this Agreement more than one year
 | 
				
			||||||
 | 
					after the cause of action arose. Each party waives its rights to a jury trial in
 | 
				
			||||||
 | 
					any resulting litigation.
 | 
				
			||||||
| 
						 | 
					@ -130,7 +130,7 @@ value_t cvalue_from_data(value_t type, void *data, size_t sz)
 | 
				
			||||||
// ptr is user-managed; we don't autorelease it unless the
 | 
					// ptr is user-managed; we don't autorelease it unless the
 | 
				
			||||||
// user explicitly calls (autorelease ) on the result of this function.
 | 
					// user explicitly calls (autorelease ) on the result of this function.
 | 
				
			||||||
// 'parent' is an optional cvalue that this pointer is known to point
 | 
					// 'parent' is an optional cvalue that this pointer is known to point
 | 
				
			||||||
// into; UNBOUND if none.
 | 
					// into; NIL if none.
 | 
				
			||||||
value_t cvalue_from_ref(value_t type, void *ptr, size_t sz, value_t parent)
 | 
					value_t cvalue_from_ref(value_t type, void *ptr, size_t sz, value_t parent)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    cvalue_t *pcv;
 | 
					    cvalue_t *pcv;
 | 
				
			||||||
| 
						 | 
					@ -146,7 +146,7 @@ value_t cvalue_from_ref(value_t type, void *ptr, size_t sz, value_t parent)
 | 
				
			||||||
    pcv->deps = NIL;
 | 
					    pcv->deps = NIL;
 | 
				
			||||||
    pcv->type = POP();
 | 
					    pcv->type = POP();
 | 
				
			||||||
    parent = POP();
 | 
					    parent = POP();
 | 
				
			||||||
    if (parent != UNBOUND) {
 | 
					    if (parent != NIL) {
 | 
				
			||||||
        // TODO: add dependency
 | 
					        // TODO: add dependency
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    cv = tagptr(pcv, TAG_BUILTIN);
 | 
					    cv = tagptr(pcv, TAG_BUILTIN);
 | 
				
			||||||
| 
						 | 
					@ -178,7 +178,7 @@ value_t cvalue_string(size_t sz)
 | 
				
			||||||
value_t cvalue_pinned_cstring(char *str)
 | 
					value_t cvalue_pinned_cstring(char *str)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    value_t v = cvalue_from_ref(symbol_value(stringtypesym), str, strlen(str),
 | 
					    value_t v = cvalue_from_ref(symbol_value(stringtypesym), str, strlen(str),
 | 
				
			||||||
                                UNBOUND);
 | 
					                                NIL);
 | 
				
			||||||
    ((cvalue_t*)ptr(v))->flags.cstring = 1;
 | 
					    ((cvalue_t*)ptr(v))->flags.cstring = 1;
 | 
				
			||||||
    return v;
 | 
					    return v;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,17 +20,6 @@
 | 
				
			||||||
  * read macros for backquote
 | 
					  * read macros for backquote
 | 
				
			||||||
  * symbol character-escaping printer
 | 
					  * symbol character-escaping printer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  * new print algorithm
 | 
					 | 
				
			||||||
     1. traverse & tag all conses to be printed. when you encounter a cons
 | 
					 | 
				
			||||||
        that is already tagged, add it to a table to give it a #n# index
 | 
					 | 
				
			||||||
     2. untag a cons when printing it. if cons is in the table, print
 | 
					 | 
				
			||||||
        "#n=" before it in the car, " . #n=" in the cdr. if cons is in the
 | 
					 | 
				
			||||||
        table but already untagged, print #n# in car or " . #n#" in the cdr.
 | 
					 | 
				
			||||||
  * read macros for #n# and #n= using the same kind of table
 | 
					 | 
				
			||||||
    * also need a table of read labels to translate from input indexes to
 | 
					 | 
				
			||||||
      normalized indexes (0 for first label, 1 for next, etc.)
 | 
					 | 
				
			||||||
  * read macro #. for eval-when-read. use for printing builtins, e.g. "#.eq"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  The value of this extra complexity, and what makes this fork worthy of
 | 
					  The value of this extra complexity, and what makes this fork worthy of
 | 
				
			||||||
  the femtoLisp brand, is that the interpreter is fully "closed" in the
 | 
					  the femtoLisp brand, is that the interpreter is fully "closed" in the
 | 
				
			||||||
  sense that all representable values can be read and printed.
 | 
					  sense that all representable values can be read and printed.
 | 
				
			||||||
| 
						 | 
					@ -48,8 +37,8 @@
 | 
				
			||||||
  * strings
 | 
					  * strings
 | 
				
			||||||
  - hash tables
 | 
					  - hash tables
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  by Jeff Bezanson
 | 
					  by Jeff Bezanson (C) 2008
 | 
				
			||||||
  Public Domain
 | 
					  Distributed under the Common Public License v1.0
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <stdlib.h>
 | 
					#include <stdlib.h>
 | 
				
			||||||
| 
						 | 
					@ -76,7 +65,8 @@ static char *builtin_names[] =
 | 
				
			||||||
      "cons", "car", "cdr", "rplaca", "rplacd",
 | 
					      "cons", "car", "cdr", "rplaca", "rplacd",
 | 
				
			||||||
      "eval", "apply", "set", "prog1", "raise",
 | 
					      "eval", "apply", "set", "prog1", "raise",
 | 
				
			||||||
      "+", "-", "*", "/", "<", "~", "&", "!", "$",
 | 
					      "+", "-", "*", "/", "<", "~", "&", "!", "$",
 | 
				
			||||||
      "vector", "aref", "aset", "length", "assoc", "compare" };
 | 
					      "vector", "aref", "aset", "length", "assoc", "compare",
 | 
				
			||||||
 | 
					      "for" };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static char *stack_bottom;
 | 
					static char *stack_bottom;
 | 
				
			||||||
#define PROCESS_STACK_SIZE (2*1024*1024)
 | 
					#define PROCESS_STACK_SIZE (2*1024*1024)
 | 
				
			||||||
| 
						 | 
					@ -651,7 +641,7 @@ static value_t eval_sexpr(value_t e, uint32_t penv, int tail)
 | 
				
			||||||
    symbol_t *sym;
 | 
					    symbol_t *sym;
 | 
				
			||||||
    uint32_t saveSP, envsz, lenv;
 | 
					    uint32_t saveSP, envsz, lenv;
 | 
				
			||||||
    int i, nargs, noeval=0;
 | 
					    int i, nargs, noeval=0;
 | 
				
			||||||
    fixnum_t s;
 | 
					    fixnum_t s, lo, hi;
 | 
				
			||||||
    cvalue_t *cv;
 | 
					    cvalue_t *cv;
 | 
				
			||||||
    int64_t accum;
 | 
					    int64_t accum;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1144,12 +1134,34 @@ static value_t eval_sexpr(value_t e, uint32_t penv, int tail)
 | 
				
			||||||
            argcount("assoc", nargs, 2);
 | 
					            argcount("assoc", nargs, 2);
 | 
				
			||||||
            v = assoc(Stack[SP-2], Stack[SP-1]);
 | 
					            v = assoc(Stack[SP-2], Stack[SP-1]);
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
 | 
					        case F_FOR:
 | 
				
			||||||
 | 
					            argcount("for", nargs, 3);
 | 
				
			||||||
 | 
					            lo = tofixnum(Stack[SP-3], "for");
 | 
				
			||||||
 | 
					            hi = tofixnum(Stack[SP-2], "for");
 | 
				
			||||||
 | 
					            f = Stack[SP-1];
 | 
				
			||||||
 | 
					            v = car(cdr(f));
 | 
				
			||||||
 | 
					            if (!iscons(v) || !iscons(cdr_(cdr_(f))) ||
 | 
				
			||||||
 | 
					                cdr_(v) != NIL)
 | 
				
			||||||
 | 
					                lerror(ArgError, "for: expected 1 argument lambda");
 | 
				
			||||||
 | 
					            f = cdr_(f);
 | 
				
			||||||
 | 
					            PUSH(f);  // save function cdr
 | 
				
			||||||
 | 
					            SP += 4;  // make space
 | 
				
			||||||
 | 
					            Stack[SP-4] = fixnum(3);       // env size
 | 
				
			||||||
 | 
					            Stack[SP-1] = cdr_(cdr_(f));   // cloenv
 | 
				
			||||||
 | 
					            for(s=lo; s <= hi; s++) {
 | 
				
			||||||
 | 
					                f = Stack[SP-5];
 | 
				
			||||||
 | 
					                Stack[SP-3] = car_(f);     // lambda list
 | 
				
			||||||
 | 
					                Stack[SP-2] = fixnum(s);   // argument value
 | 
				
			||||||
 | 
					                v = eval_sexpr(car_(cdr_(f)), SP-3, 0);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
        case F_SPECIAL_APPLY:
 | 
					        case F_SPECIAL_APPLY:
 | 
				
			||||||
            v = Stack[saveSP-4];
 | 
					            v = Stack[saveSP-4];
 | 
				
			||||||
            f = Stack[saveSP-5];
 | 
					            f = Stack[saveSP-5];
 | 
				
			||||||
            PUSH(f);
 | 
					            PUSH(f);
 | 
				
			||||||
            PUSH(v);
 | 
					            PUSH(v);
 | 
				
			||||||
            nargs = 2;
 | 
					            nargs = 2;
 | 
				
			||||||
 | 
					            // falls through!!
 | 
				
			||||||
        case F_APPLY:
 | 
					        case F_APPLY:
 | 
				
			||||||
            argcount("apply", nargs, 2);
 | 
					            argcount("apply", nargs, 2);
 | 
				
			||||||
            v = Stack[saveSP] = Stack[SP-1];  // second arg is new arglist
 | 
					            v = Stack[saveSP] = Stack[SP-1];  // second arg is new arglist
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -86,7 +86,7 @@ enum {
 | 
				
			||||||
    F_CONS, F_CAR, F_CDR, F_RPLACA, F_RPLACD,
 | 
					    F_CONS, F_CAR, F_CDR, F_RPLACA, F_RPLACD,
 | 
				
			||||||
    F_EVAL, F_APPLY, F_SET, F_PROG1, F_RAISE,
 | 
					    F_EVAL, F_APPLY, F_SET, F_PROG1, F_RAISE,
 | 
				
			||||||
    F_ADD, F_SUB, F_MUL, F_DIV, F_LT, F_BNOT, F_BAND, F_BOR, F_BXOR,
 | 
					    F_ADD, F_SUB, F_MUL, F_DIV, F_LT, F_BNOT, F_BAND, F_BOR, F_BXOR,
 | 
				
			||||||
    F_VECTOR, F_AREF, F_ASET, F_LENGTH, F_ASSOC, F_COMPARE,
 | 
					    F_VECTOR, F_AREF, F_ASET, F_LENGTH, F_ASSOC, F_COMPARE, F_FOR,
 | 
				
			||||||
    N_BUILTINS
 | 
					    N_BUILTINS
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
#define isspecial(v) (uintval(v) <= (unsigned int)F_PROGN)
 | 
					#define isspecial(v) (uintval(v) <= (unsigned int)F_PROGN)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,6 @@
 | 
				
			||||||
; femtoLisp standard library
 | 
					; femtoLisp standard library
 | 
				
			||||||
; by Jeff Bezanson
 | 
					; by Jeff Bezanson (C) 2008
 | 
				
			||||||
; Public Domain
 | 
					; Distributed under the Common Public License v1.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(set 'list (lambda args args))
 | 
					(set 'list (lambda args args))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -269,22 +269,23 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(defmacro dotimes (var . body)
 | 
					(defmacro dotimes (var . body)
 | 
				
			||||||
  (let ((v (car var))
 | 
					  (let ((v (car var))
 | 
				
			||||||
        (cnt (cadr var)))
 | 
					        (cnt (cadr var))
 | 
				
			||||||
    (list 'let (list (list v 0))
 | 
					        (lim (gensym)))
 | 
				
			||||||
          (list 'while (list < v cnt)
 | 
					    `(let ((,lim (- ,cnt 1)))
 | 
				
			||||||
                (list prog1 (f-body body) (list 'setq v (list + v 1)))))))
 | 
					       (for 0 ,lim
 | 
				
			||||||
 | 
					            (lambda (,v) ,(f-body body))))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(defun map-int (f n)
 | 
					(defun map-int (f n)
 | 
				
			||||||
  (if (<= n 0)
 | 
					  (if (<= n 0)
 | 
				
			||||||
      ()
 | 
					      ()
 | 
				
			||||||
    (let ((first (cons (f 0) nil)))
 | 
					    (let ((first (cons (f 0) nil))
 | 
				
			||||||
      ((label map-int-
 | 
					          (acc nil))
 | 
				
			||||||
              (lambda (acc i n)
 | 
					      (setq acc first)
 | 
				
			||||||
                (if (= i n)
 | 
					      (for 1 (- n 1)
 | 
				
			||||||
                    first
 | 
					           (lambda (i)
 | 
				
			||||||
                  (progn (rplacd acc (cons (f i) nil))
 | 
					             (progn (rplacd acc (cons (f i) nil))
 | 
				
			||||||
                         (map-int- (cdr acc) (+ i 1) n)))))
 | 
					                    (setq acc (cdr acc)))))
 | 
				
			||||||
       first 1 n))))
 | 
					      first)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(defun iota (n) (map-int identity n))
 | 
					(defun iota (n) (map-int identity n))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -403,11 +404,11 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(defun list-to-vector (l) (apply vector l))
 | 
					(defun list-to-vector (l) (apply vector l))
 | 
				
			||||||
(defun vector-to-list (v)
 | 
					(defun vector-to-list (v)
 | 
				
			||||||
  (let ((i (- (length v) 1))
 | 
					  (let ((n (length v))
 | 
				
			||||||
        (l nil))
 | 
					        (l nil))
 | 
				
			||||||
    (while (>= i 0)
 | 
					    (for 1 n
 | 
				
			||||||
      (setq l (cons (aref v i) l))
 | 
					         (lambda (i)
 | 
				
			||||||
      (setq i (- i 1)))
 | 
					           (setq l (cons (aref v (- n i)) l))))
 | 
				
			||||||
    l))
 | 
					    l))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(defun self-evaluating-p (x)
 | 
					(defun self-evaluating-p (x)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -57,6 +57,18 @@
 | 
				
			||||||
             ,(f-body body)
 | 
					             ,(f-body body)
 | 
				
			||||||
           (setq ,v (+ ,v 1)))))))
 | 
					           (setq ,v (+ ,v 1)))))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(defun map-int (f n)
 | 
				
			||||||
 | 
					  (if (<= n 0)
 | 
				
			||||||
 | 
					      ()
 | 
				
			||||||
 | 
					    (let ((first (cons (f 0) nil)))
 | 
				
			||||||
 | 
					      ((label map-int-
 | 
				
			||||||
 | 
					              (lambda (acc i n)
 | 
				
			||||||
 | 
					                (if (= i n)
 | 
				
			||||||
 | 
					                    first
 | 
				
			||||||
 | 
					                  (progn (rplacd acc (cons (f i) nil))
 | 
				
			||||||
 | 
					                         (map-int- (cdr acc) (+ i 1) n)))))
 | 
				
			||||||
 | 
					       first 1 n))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(defmacro labl (name fn)
 | 
					(defmacro labl (name fn)
 | 
				
			||||||
  `((lambda (,name) (setq ,name ,fn)) nil))
 | 
					  `((lambda (,name) (setq ,name ,fn)) nil))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -122,6 +122,7 @@ for internal use:
 | 
				
			||||||
   and a more efficient apply() entry point
 | 
					   and a more efficient apply() entry point
 | 
				
			||||||
 . disadvantage is looking through the lambda list on every lookup. maybe
 | 
					 . disadvantage is looking through the lambda list on every lookup. maybe
 | 
				
			||||||
   improve by making lambda lists vectors somehow?
 | 
					   improve by making lambda lists vectors somehow?
 | 
				
			||||||
 | 
					* fast builtin bounded iteration construct (for lo hi (lambda (x) ...))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bugs:
 | 
					bugs:
 | 
				
			||||||
* with the fully recursive (simpler) relocate(), the size of cons chains
 | 
					* with the fully recursive (simpler) relocate(), the size of cons chains
 | 
				
			||||||
| 
						 | 
					@ -830,6 +831,19 @@ IOStream API
 | 
				
			||||||
*rand.uint64
 | 
					*rand.uint64
 | 
				
			||||||
*rand.double
 | 
					*rand.double
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * new print algorithm
 | 
				
			||||||
 | 
					     1. traverse & tag all conses to be printed. when you encounter a cons
 | 
				
			||||||
 | 
					        that is already tagged, add it to a table to give it a #n# index
 | 
				
			||||||
 | 
					     2. untag a cons when printing it. if cons is in the table, print
 | 
				
			||||||
 | 
					        "#n=" before it in the car, " . #n=" in the cdr. if cons is in the
 | 
				
			||||||
 | 
					        table but already untagged, print #n# in car or " . #n#" in the cdr.
 | 
				
			||||||
 | 
					  * read macros for #n# and #n= using the same kind of table
 | 
				
			||||||
 | 
					    * also need a table of read labels to translate from input indexes to
 | 
				
			||||||
 | 
					      normalized indexes (0 for first label, 1 for next, etc.)
 | 
				
			||||||
 | 
					  * read macro #. for eval-when-read. use for printing builtins, e.g. "#.eq"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-----------------------------------------------------------------------------
 | 
					-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
prettyprint notes
 | 
					prettyprint notes
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue