| top | |
static int setp(ClientData clientData,Intr intr,int N,Tcl_Obj *const P[]) {
int i,q,r; Obj *Q,*R;
if (N!=3) {
rprintf(intr,"usage: setp {var...} list-value");
return TCL_ERROR;
}
if (Tcl_ListObjGetElements(intr,P[1],&q,&Q)!=TCL_OK) return TCL_ERROR;
if (Tcl_ListObjGetElements(intr,P[2],&r,&R)!=TCL_OK) return TCL_ERROR;
for (i=0; i<q; i++) {
Obj v = i>=r ? Tcl_NewObj() : R[i];
if (!Tcl_ObjSetVar2(intr,Q[i],0,v,TCL_LEAVE_ERR_MSG)) {
if (i>=r) decr(incr(v)); return TCL_ERROR;
}
}
if (r>q) {
Tcl_SetObjResult(intr,Tcl_NewListObj(r-q,R+q));
} else {
Tcl_ResetResult(intr);
}
return TCL_OK;
}
setp command.Syntax.Variables.Single variable not in a list. Single variable in a list. Values.Single value not in a list. Semantics.Equal number of variables and values. More variables than values. Fewer variables than values. |
| ^ | | | | | | section top | | | ^ | | | | | | section top | |
static int lambda(ClientData clientData,Intr intr,int N,Tcl_Obj *const P[]) {
char namespaceCurrent[] = "namespace current";
int i,rc = TCL_ERROR;
Obj namespace = 0,token = 0;
Obj *E,e = 0;
if (N<3) {
rprintf(intr,"usage: %{y}s {parameter...} {body} [arguments...]",*P);
goto quit;
return TCL_ERROR;
}
namespace = Tcl_Eval(intr,namespaceCurrent)==TCL_OK ? Tcl_GetObjResult(intr) : Tcl_NewStringObj("::",-1);
incr(namespace);
<Create a lambda expression token>
E = nheap(N-2,Obj);
E[0] = token;
for (i=3; i<N; i++) E[i-2] = P[i];
e = incr(Tcl_NewListObj(N-2,E));
dispose(E);
<Compile lambda object>
if (clientData) {
rc = Tcl_EvalObjEx(intr,e,TCL_EVAL_DIRECT);
} else {
Tcl_SetObjResult(intr,e);
rc = TCL_OK;
}
quit:
decr(namespace);
decr(token);
decr(e);
return rc;
}
| ^ | | | | | | section top | |
{
int i,n; chars s = Tcl_GetStringFromObj(namespace,&n);
token = incr(Tcl_DuplicateObj(namespace));
if (n<2 || s[n-2]!=':' || s[n-1]!=':') Tcl_AppendToObj(token,"::",-1);
Tcl_AppendToObj(token,"(wyrm-lambda-body)",-1);
for (i=1; i<3; i++) {
Tcl_AppendToObj(token,"@@",-1);
for (s=Tcl_GetStringFromObj(P[i],&n); n>0; n--,s++)
if (*s<=' ' || *s>=127) {
char B[4]; sprintf(B,"@%02X",0xFF&*s); Tcl_AppendToObj(token,B,-1);
}else switch (*s) {
case '@': Tcl_AppendToObj(token,"@G",-1); break;
case '{': Tcl_AppendToObj(token,"@H",-1); break;
case '}': Tcl_AppendToObj(token,"@I",-1); break;
case '[': Tcl_AppendToObj(token,"@J",-1); break;
case ']': Tcl_AppendToObj(token,"@K",-1); break;
case 042: Tcl_AppendToObj(token,"@L",-1); break;
case '\\': Tcl_AppendToObj(token,"@M",-1); break;
case '$': Tcl_AppendToObj(token,"@N",-1); break;
case ':': Tcl_AppendToObj(token,"@O",-1); break;
default: Tcl_AppendToObj(token,s,1); break;
}
}
}
| ^ | | | | | | section top | | - proc compileLambdaProc—Ensure a compiled version of the lambda exists.
| - output intr—Where the compiled proc lives.
| - io proc—The proc element of a lambda expression.
|
|
|
{
Tcl_CmdInfo info;
if (!Tcl_GetCommandInfo(intr,Tcl_GetString(token),&info)) {
Obj PROC[4],proc;
PROC[0] = Tcl_NewStringObj("proc",-1);
PROC[1] = token;
PROC[2] = P[1];
PROC[3] = P[2];
proc = incr(Tcl_NewListObj(4,PROC));
rc = Tcl_EvalObjEx(intr, proc,TCL_EVAL_DIRECT|TCL_EVAL_GLOBAL);
decr(proc);
if (rc!=TCL_OK) goto quit;
}
}
| ^ | | | | | | section top | | lambda and block commands.Syntax.Parameter list.Single variable not in a list. Single variable in a list. Proc body.With suppressed substitutions. Arguments.With suppressed substitutions. Semantics.Lambda expression.Lambda expression formed and no arguments applied. More arguments appended.With suppressed substitutions. Lambda expression evaluated.With suppressed substitutions. Namespace.Formed in global space, evalled in global space. Formed in global space, evalled in namespace. Formed in namespace, evalled in global space. Formed in namespace, evalled in namespace. |
| ^ | | | | | | section top | |
static int tryBlock(ClientData clientData,Intr intr,int N,Tcl_Obj *const P[]) {
int rc = TCL_OK; Obj rs=0,ei=0,ec=0; chars RS,EI; int n;
if (N<2 || (N&1)==1) {
rprintf(intr,"usage: try script [recovery-selectors recovery-script]...");
return TCL_ERROR;
}
Tcl_AllowExceptions(intr);
rc = Tcl_EvalObjEx(intr,P[1],TCL_EVAL_DIRECT);
rs = incr(Tcl_GetObjResult(intr));
ei = incr(Tcl_GetVar2Ex(intr,"errorInfo",0,TCL_GLOBAL_ONLY));
ec = incr(Tcl_GetVar2Ex(intr,"errorCode",0,TCL_GLOBAL_ONLY));
if (!Tcl_SetVar2Ex(intr,"rc",0,Tcl_NewIntObj(rc),TCL_LEAVE_ERR_MSG)) goto exit;
if (!Tcl_SetVar2Ex(intr,"rs",0,rs,TCL_LEAVE_ERR_MSG)) {rc = TCL_ERROR; goto exit;}
if (!ei) ei = incr(Tcl_NewObj());
if (!Tcl_SetVar2Ex(intr,"ei",0,ei,TCL_LEAVE_ERR_MSG)) {rc = TCL_ERROR; goto exit;}
if (!ec) ec = incr(Tcl_NewObj());
if (!Tcl_SetVar2Ex(intr,"ec",0,ec,TCL_LEAVE_ERR_MSG)) {rc = TCL_ERROR; goto exit;}
RS = Tcl_GetStringFromObj(rs,0);
while (N-=2, P+=2, N>0) {
int M; Obj *Q; bool selected=false,catching=false,resetting=false; int rc1;
if (Tcl_ListObjGetElements(intr,P[0],&M,&Q)!=TCL_OK) {rc = TCL_ERROR; goto exit;}
for (; M>0; --M,++Q) {
chars s = Tcl_GetStringFromObj(*Q,0);
if (strieq(s,"okay")) selected = selected || rc==TCL_OK;
else if (strieq(s,"error")) selected = selected || rc==TCL_ERROR;
else if (strieq(s,"return")) selected = selected || rc==TCL_RETURN;
else if (strieq(s,"break")) selected = selected || rc==TCL_BREAK;
else if (strieq(s,"continue")) selected = selected || rc==TCL_CONTINUE;
else if (strieq(s,"*")) selected = true;
else if (strieq(s,"catch")) catching = true;
else if (strieq(s,"reset")) resetting = true;
else if (stribegins("okay:",s))
selected = selected
|| (rc==TCL_OK && Tcl_StringMatch(RS,s+5));
else if (stribegins("error:",s))
selected = selected
|| (rc==TCL_ERROR && Tcl_StringMatch(RS,s+6));
else if (stribegins("return:",s))
selected = selected
|| (rc==TCL_RETURN && Tcl_StringMatch(RS,s+7));
else {
Tcl_ResetResult(intr);
Tcl_AppendResult(intr,"try: unknown selector: ",s,0);
rc = TCL_ERROR; goto exit;
}
}
if (selected) {
if (resetting) {
if (Tcl_SetVar2Ex(intr,"rc",0,Tcl_NewIntObj(TCL_OK),TCL_LEAVE_ERR_MSG)) {
rc = TCL_OK;
}else {
rc = TCL_ERROR;
goto exit;
}
}
Tcl_AllowExceptions(intr);
rc1 = Tcl_EvalObjEx(intr,P[1],TCL_EVAL_DIRECT);
if (!catching && rc1!=TCL_OK) {
rc = rc1; goto exit;
}
}
}
Tcl_ResetResult(intr);
Tcl_SetObjResult(intr,rs);
EI = Tcl_GetStringFromObj(ei,&n);
Tcl_AddObjErrorInfo(intr,EI,n);
Tcl_SetObjErrorCode(intr,ec);
exit:
decr(rs); decr(ei); decr(ec);
return rc;
}
try command.Syntax.Recovery selector.Empty recovery selectors. Single valid recovery selector. Multiple valid recovery selectors. Invalid recovery selector. Semantics.Error variables: rc, rs, ei, and ec. Recovery selection.Bodies selected.Recovery body not selected. Multiple recovery bodies selected. No recovery body selected. |
| ^ | | | | | | section top | |
int wyrm_utilityCommandInit(Intr intr);
| ^ | Definition continued at: 63, 66, 67. | | | | | section top | |
static int about(ClientData clientData,Intr intr,int N,Tcl_Obj *const P[]) {
rprintf(intr,
"Wyrmwif Tcl extensions\n"
"Copyright (C) 2002, 2004 SM Ryan. All rights reserved.\n"
"Version " VERSION "\n"
"Build date " __DATE__
);
return TCL_OK;
}
int wyrm_utilityCommandInit(Intr intr) {
char package[] =
"namespace eval ::wyrm {\n"
" namespace export setp\n"
" namespace export lambda\n"
" namespace export block\n"
" namespace export try\n"
"}\n";
Tcl_CreateObjCommand(intr,"::wyrm::about",about,0,0);
Tcl_CreateObjCommand(intr,"::wyrm::setp",setp,0,0);
Tcl_CreateObjCommand(intr,"::wyrm::lambda",lambda,0,0);
Tcl_CreateObjCommand(intr,"::wyrm::block",lambda,"block",0);
Tcl_CreateObjCommand(intr,"::wyrm::try",tryBlock,0,0);
return Tcl_Eval(intr,package);
}
| ^ | Definition continued at: 64, 68. | | | | | section top | | |
|