aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Peter McGoron 2024-07-16 15:36:01 -0400
committerGravatar Peter McGoron 2024-07-16 15:36:01 -0400
commit23ad0700399ebbb8feb2f957e6c2c01074bc7974 (patch)
tree2cbb80b642cf53f2d39a5d35ce26e807e00fb92c
parentuns_lisp: cps-if (diff)
uns_lisp: cps-lambda
Diffstat (limited to '')
-rw-r--r--examples/lisp/uns_lisp.c73
1 files changed, 63 insertions, 10 deletions
diff --git a/examples/lisp/uns_lisp.c b/examples/lisp/uns_lisp.c
index c9ba1e0..aa450a1 100644
--- a/examples/lisp/uns_lisp.c
+++ b/examples/lisp/uns_lisp.c
@@ -1013,8 +1013,8 @@ enum cps_return {
CPS_QUOTE_OVERFLOW,
CPS_QUASIQUOTE_UNDERFLOW,
CPS_QUASIQUOTE_OVERFLOW,
- CPS_LAMBDA_UNDERFLOW,
- CPS_LAMBDA_OVERFLOW,
+ CPS_EXEC_LAMBDA_UNDERFLOW,
+ CPS_EXEC_LAMBDA_OVERFLOW,
CPS_INVALID_LAMBDA_FORMAL,
CPS_DYNAMIC_WIND_UNDERFLOW,
CPS_DYNAMIC_WIND_SYMBOL,
@@ -1037,6 +1037,7 @@ enum cps_return {
CPS_FCALL_IMPROPER_LIST,
CPS_SWAP_UNDERFLOW,
CPS_IF_UNDERFLOW,
+ CPS_LAMBDA_UNDERFLOW,
CPS_RETURN_LEN
};
@@ -1051,8 +1052,8 @@ static const char *cps_return_to_string[CPS_RETURN_LEN] = {
"CPS_QUOTE_OVERFLOW",
"CPS_QUASIQUOTE_UNDERFLOW",
"CPS_QUASIQUOTE_OVERFLOW",
- "CPS_LAMBDA_UNDERFLOW",
- "CPS_LAMBDA_OVERFLOW",
+ "CPS_EXEC_LAMBDA_UNDERFLOW",
+ "CPS_EXEC_LAMBDA_OVERFLOW",
"CPS_INVALID_LAMBDA_FORMAL",
"CPS_DYNAMIC_WIND_UNDERFLOW",
"CPS_DYNAMIC_WIND_SYMBOL",
@@ -1074,7 +1075,8 @@ static const char *cps_return_to_string[CPS_RETURN_LEN] = {
"CPS_APP_UNDERFLOW",
"CPS_FCALL_IMPROPER_LIST",
"CPS_SWAP_UNDERFLOW",
- "CPS_IF_UNDERFLOW"
+ "CPS_IF_UNDERFLOW",
+ "CPS_LAMBDA_UNDERFLOW"
};
/* {K (quote QUOTED)} {cps} = {(-> (quote QUOTED) K)} */
@@ -1141,8 +1143,6 @@ static enum cps_return cps_exec_quasiquote(struct uns_ctr *prevstack,
/* {K (lambda l BODY)} {cps}
= {k BODY l k K} {cps cps-lambda}
-
- {LAMBODY l k K} {cps-lambda} = {(-> (lambda l (kappa k LAMBODY))) K)}
*/
static enum cps_return cps_exec_lambda(struct uns_ctr *prevstack,
struct uns_ctr *K,
@@ -1171,7 +1171,7 @@ static enum cps_return cps_exec_lambda(struct uns_ctr *prevstack,
\ tmp.p */
tmp.p = CAR(rest->p);
switch (get_type(tmp.p)) {
- case SYMBOL: case LISP_NULL: case EMPTY_LIST:
+ case SYMBOL: case EMPTY_LIST: case CELL:
break;
default:
r = CPS_INVALID_LAMBDA_FORMAL;
@@ -1182,12 +1182,12 @@ static enum cps_return cps_exec_lambda(struct uns_ctr *prevstack,
rest->p = CDR(rest->p);
if (get_type(rest->p) != CELL) {
- r = CPS_LAMBDA_UNDERFLOW;
+ r = CPS_EXEC_LAMBDA_UNDERFLOW;
goto cleanup;
}
if (get_type(CDR(rest->p)) != EMPTY_LIST) {
- r = CPS_LAMBDA_OVERFLOW;
+ r = CPS_EXEC_LAMBDA_OVERFLOW;
goto cleanup;
}
@@ -1861,6 +1861,57 @@ end:
return r;
}
+/*
+ {LAMBODY l k K} {cps-lambda} = {(-> (lambda-kappa l k LAMBODY)) K)}
+ */
+static enum cps_return cps_lambda(struct uns_ctr *prevstack)
+{
+ struct uns_ctr lambody = {0};
+ struct uns_ctr l = {0};
+ struct uns_ctr ksymb = {0};
+ struct uns_ctr K = {0};
+ struct uns_ctr tmp = {0};
+ struct uns_ctr body = {0};
+ enum cps_return r = CPS_CONTINUE;
+
+ uns_root_add(gc, &lambody);
+ uns_root_add(gc, &l);
+ uns_root_add(gc, &ksymb);
+ uns_root_add(gc, &K);
+ uns_root_add(gc, &tmp);
+ uns_root_add(gc, &body);
+
+ if (!stack_pop(prevstack, &lambody)
+ || !stack_pop(prevstack, &l)
+ || !stack_pop(prevstack, &ksymb)
+ || !stack_pop(prevstack, &K)) {
+ r = CPS_LAMBDA_UNDERFLOW;
+ goto end;
+ }
+
+ body.p = empty_list.p;
+ stack_push(&body, &lambody);
+ stack_push(&body, &ksymb);
+ stack_push(&body, &l);
+ stack_push_const(&body, "LK");
+
+ tmp.p = body.p;
+ body.p = empty_list.p;
+ stack_push(&body, &K);
+ stack_push(&body, &tmp);
+ stack_push_const(&body, "->");
+
+ stack_push(prevstack, &body);
+end:
+ uns_root_remove(gc, &lambody);
+ uns_root_remove(gc, &l);
+ uns_root_remove(gc, &ksymb);
+ uns_root_remove(gc, &K);
+ uns_root_remove(gc, &tmp);
+ uns_root_remove(gc, &body);
+ return r;
+}
+
static enum cps_return cps(struct uns_ctr *prevstack,
struct uns_ctr *readstack)
{
@@ -1889,6 +1940,8 @@ static enum cps_return cps(struct uns_ctr *prevstack,
r = cps_swap(prevstack, 2, readstack);
} else if (strcmp(cmd, "cps-if") == 0) {
r = cps_if(prevstack, readstack);
+ } else if (strcmp(cmd, "cps-lambda") == 0) {
+ r = cps_lambda(prevstack);
} else {
r = CPS_INVALID_CMD;
}
dfacd0?s=13&d=retro' width='13' height='13' alt='Gravatar' /> bencollins 1-4/+0 the svn log is more than verbose enough for info seekers. git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@110 53a565d1-3bb7-0310-b661-cf11e63c67ab 2003-07-13Fix compiler warnings.Gravatar bencollins 4-12/+22 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@109 53a565d1-3bb7-0310-b661-cf11e63c67ab 2003-07-13Updates from 0.10.0 release.Gravatar bencollins 4-5/+14 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@108 53a565d1-3bb7-0310-b661-cf11e63c67ab 2003-04-23add libtoolize to bootstrapGravatar ddennedy 1-1/+10 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@107 53a565d1-3bb7-0310-b661-cf11e63c67ab 2003-04-21added Dan Maas' rawiso docsGravatar ddennedy 1-32/+295 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@106 53a565d1-3bb7-0310-b661-cf11e63c67ab 2003-04-07new_handle_on_port() error path fix from Jim RadfordGravatar dmaas 1-1/+3 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@105 53a565d1-3bb7-0310-b661-cf11e63c67ab 2003-03-26add raw1394_new_handle_on_port() convenience functionGravatar dmaas 2-1/+41 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@104 53a565d1-3bb7-0310-b661-cf11e63c67ab 2003-02-22Updates for new rawiso ioctl interface.Gravatar bencollins 3-37/+125 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@103 53a565d1-3bb7-0310-b661-cf11e63c67ab 2003-01-15add iso_xmit_sync() and iso_xmit_write(); clean up iso handling a bitGravatar dmaas 5-39/+161 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@102 53a565d1-3bb7-0310-b661-cf11e63c67ab 2003-01-15implement tag matching for rawiso receptionGravatar dmaas 3-4/+12 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@101 53a565d1-3bb7-0310-b661-cf11e63c67ab 2003-01-06back out previous commit - don't drop the legacy API just yetGravatar dmaas 6-173/+130 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@100 53a565d1-3bb7-0310-b661-cf11e63c67ab 2003-01-05emulate legacy ISO reception API on top of new rawiso APIGravatar dmaas 7-131/+174 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@99 53a565d1-3bb7-0310-b661-cf11e63c67ab 2002-12-24update iso API for multi-channel reception and new packet buffer layoutGravatar dmaas 4-123/+236 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@98 53a565d1-3bb7-0310-b661-cf11e63c67ab 2002-12-20oops, irq_interval needs to be signedGravatar anonymous 1-1/+1 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@97 53a565d1-3bb7-0310-b661-cf11e63c67ab 2002-12-20dmaas - renamed exported arm definitions into the raw1394_ namespace; ↵Gravatar anonymous 3-124/+48 brought kernel-raw1394.h back in sync with the kernel version git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@96 53a565d1-3bb7-0310-b661-cf11e63c67ab 2002-12-16rawiso updates:Gravatar dmaas 3-18/+25 - changed return type of rawiso xmit/recv handlers from int to enum raw1394_iso_disposition - added an ioctl (RAW1394_ISO_QUEUE_ACTIVITY) to force an ISO_ACTIVITY event into the queue. This is needed for handling RAW1394_ISO_DEFER, to kick us out of the next read() instead of sleeping forever. - removed references to "8-byte" isochronous header - this is an OHCI-specific implementation detail git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@95 53a565d1-3bb7-0310-b661-cf11e63c67ab 2002-11-18fix cplusplus extern C blockGravatar ddennedy 1-4/+4 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@94 53a565d1-3bb7-0310-b661-cf11e63c67ab 2002-11-18merged rawiso branchGravatar ddennedy 7-6/+488 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@93 53a565d1-3bb7-0310-b661-cf11e63c67ab