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