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
|
||||
// user explicitly calls (autorelease ) on the result of this function.
|
||||
// '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)
|
||||
{
|
||||
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->type = POP();
|
||||
parent = POP();
|
||||
if (parent != UNBOUND) {
|
||||
if (parent != NIL) {
|
||||
// TODO: add dependency
|
||||
}
|
||||
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 v = cvalue_from_ref(symbol_value(stringtypesym), str, strlen(str),
|
||||
UNBOUND);
|
||||
NIL);
|
||||
((cvalue_t*)ptr(v))->flags.cstring = 1;
|
||||
return v;
|
||||
}
|
||||
|
|
|
@ -20,17 +20,6 @@
|
|||
* read macros for backquote
|
||||
* 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 femtoLisp brand, is that the interpreter is fully "closed" in the
|
||||
sense that all representable values can be read and printed.
|
||||
|
@ -48,8 +37,8 @@
|
|||
* strings
|
||||
- hash tables
|
||||
|
||||
by Jeff Bezanson
|
||||
Public Domain
|
||||
by Jeff Bezanson (C) 2008
|
||||
Distributed under the Common Public License v1.0
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
|
@ -76,7 +65,8 @@ static char *builtin_names[] =
|
|||
"cons", "car", "cdr", "rplaca", "rplacd",
|
||||
"eval", "apply", "set", "prog1", "raise",
|
||||
"+", "-", "*", "/", "<", "~", "&", "!", "$",
|
||||
"vector", "aref", "aset", "length", "assoc", "compare" };
|
||||
"vector", "aref", "aset", "length", "assoc", "compare",
|
||||
"for" };
|
||||
|
||||
static char *stack_bottom;
|
||||
#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;
|
||||
uint32_t saveSP, envsz, lenv;
|
||||
int i, nargs, noeval=0;
|
||||
fixnum_t s;
|
||||
fixnum_t s, lo, hi;
|
||||
cvalue_t *cv;
|
||||
int64_t accum;
|
||||
|
||||
|
@ -1144,12 +1134,34 @@ static value_t eval_sexpr(value_t e, uint32_t penv, int tail)
|
|||
argcount("assoc", nargs, 2);
|
||||
v = assoc(Stack[SP-2], Stack[SP-1]);
|
||||
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:
|
||||
v = Stack[saveSP-4];
|
||||
f = Stack[saveSP-5];
|
||||
PUSH(f);
|
||||
PUSH(v);
|
||||
nargs = 2;
|
||||
// falls through!!
|
||||
case F_APPLY:
|
||||
argcount("apply", nargs, 2);
|
||||
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_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_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
|
||||
};
|
||||
#define isspecial(v) (uintval(v) <= (unsigned int)F_PROGN)
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
; femtoLisp standard library
|
||||
; by Jeff Bezanson
|
||||
; Public Domain
|
||||
; by Jeff Bezanson (C) 2008
|
||||
; Distributed under the Common Public License v1.0
|
||||
|
||||
(set 'list (lambda args args))
|
||||
|
||||
|
@ -269,22 +269,23 @@
|
|||
|
||||
(defmacro dotimes (var . body)
|
||||
(let ((v (car var))
|
||||
(cnt (cadr var)))
|
||||
(list 'let (list (list v 0))
|
||||
(list 'while (list < v cnt)
|
||||
(list prog1 (f-body body) (list 'setq v (list + v 1)))))))
|
||||
(cnt (cadr var))
|
||||
(lim (gensym)))
|
||||
`(let ((,lim (- ,cnt 1)))
|
||||
(for 0 ,lim
|
||||
(lambda (,v) ,(f-body body))))))
|
||||
|
||||
(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
|
||||
(let ((first (cons (f 0) nil))
|
||||
(acc nil))
|
||||
(setq acc first)
|
||||
(for 1 (- n 1)
|
||||
(lambda (i)
|
||||
(progn (rplacd acc (cons (f i) nil))
|
||||
(map-int- (cdr acc) (+ i 1) n)))))
|
||||
first 1 n))))
|
||||
(setq acc (cdr acc)))))
|
||||
first)))
|
||||
|
||||
(defun iota (n) (map-int identity n))
|
||||
|
||||
|
@ -403,11 +404,11 @@
|
|||
|
||||
(defun list-to-vector (l) (apply vector l))
|
||||
(defun vector-to-list (v)
|
||||
(let ((i (- (length v) 1))
|
||||
(let ((n (length v))
|
||||
(l nil))
|
||||
(while (>= i 0)
|
||||
(setq l (cons (aref v i) l))
|
||||
(setq i (- i 1)))
|
||||
(for 1 n
|
||||
(lambda (i)
|
||||
(setq l (cons (aref v (- n i)) l))))
|
||||
l))
|
||||
|
||||
(defun self-evaluating-p (x)
|
||||
|
|
|
@ -57,6 +57,18 @@
|
|||
,(f-body body)
|
||||
(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)
|
||||
`((lambda (,name) (setq ,name ,fn)) nil))
|
||||
|
||||
|
|
|
@ -122,6 +122,7 @@ for internal use:
|
|||
and a more efficient apply() entry point
|
||||
. disadvantage is looking through the lambda list on every lookup. maybe
|
||||
improve by making lambda lists vectors somehow?
|
||||
* fast builtin bounded iteration construct (for lo hi (lambda (x) ...))
|
||||
|
||||
bugs:
|
||||
* with the fully recursive (simpler) relocate(), the size of cons chains
|
||||
|
@ -830,6 +831,19 @@ IOStream API
|
|||
*rand.uint64
|
||||
*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
|
||||
|
|
Loading…
Reference in New Issue