This is conditional.c in view mode; [Download] [Up]
/* Copyright (C) 1994 M. Hagiya, W. Schelter, T. Yuasa This file is part of GNU Common Lisp, herein referred to as GCL GCL is free software; you can redistribute it and/or modify it under the terms of the GNU LIBRARY GENERAL PUBLIC LICENSE as published by the Free Software Foundation; either version 2, or (at your option) any later version. GCL is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with GCL; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ /* conditional.c conditionals */ #include "include.h" object sLotherwise; Fif(form) object form; { object endp_temp; object *top = vs_top; if (endp(form) || endp(MMcdr(form))) FEtoo_few_argumentsF(form); if (!endp(MMcddr(form)) && !endp(MMcdddr(form))) FEtoo_many_argumentsF(form); eval(MMcar(form)); if (vs_base[0] == Cnil) if (endp(MMcddr(form))) { vs_top = vs_base = top; vs_push(Cnil); } else { vs_top = top; eval(MMcaddr(form)); } else { vs_top = top; eval(MMcadr(form)); } } Fcond(args) object args; { object endp_temp; object *top = vs_top; object clause; object conseq; while (!endp(args)) { clause = MMcar(args); if (type_of(clause) != t_cons) FEerror("~S is an illegal COND clause.",1,clause); eval(MMcar(clause)); if (vs_base[0] != Cnil) { conseq = MMcdr(clause); if (endp(conseq)) { vs_top = vs_base+1; return; } while (!endp(conseq)) { vs_top = top; eval(MMcar(conseq)); conseq = MMcdr(conseq); } return; } vs_top = top; args = MMcdr(args); } vs_base = vs_top = top; vs_push(Cnil); } Fcase(arg) object arg; { object endp_temp; object *top = vs_top; object clause; object key; object conseq; if (endp(arg)) FEtoo_few_argumentsF(arg); eval(MMcar(arg)); vs_top = top; vs_push(vs_base[0]); arg = MMcdr(arg); while (!endp(arg)) { clause = MMcar(arg); if (type_of(clause) != t_cons) FEerror("~S is an illegal CASE clause.",1,clause); key = MMcar(clause); conseq = MMcdr(clause); if (type_of(key) == t_cons) do { if (eql(MMcar(key),top[0])) goto FOUND; key = MMcdr(key); } while (!endp(key)); else if (key == Cnil) ; else if (key == Ct || key == sLotherwise || eql(key,top[0])) goto FOUND; arg = MMcdr(arg); } vs_base = vs_top = top; vs_push(Cnil); return; FOUND: if (endp(conseq)) { vs_base = vs_top = top; vs_push(Cnil); } else do { vs_top = top; eval(MMcar(conseq)); conseq = MMcdr(conseq); } while (!endp(conseq)); return; } Fwhen(form) object form; { object endp_temp; object *top = vs_top; if (endp(form)) FEtoo_few_argumentsF(form); eval(MMcar(form)); if (vs_base[0] == Cnil) { vs_base = vs_top = top; vs_push(Cnil); } else { form = MMcdr(form); if (endp(form)) { vs_base = vs_top = top; vs_push(Cnil); } else do { vs_top = top; eval(MMcar(form)); form = MMcdr(form); } while (!endp(form)); } } Funless(form) object form; { object endp_temp; object *top = vs_top; if (endp(form)) FEtoo_few_argumentsF(form); eval(MMcar(form)); if (vs_base[0] == Cnil) { vs_top = top; form = MMcdr(form); if (endp(form)) { vs_base = vs_top = top; vs_push(Cnil); } else do { vs_top = top; eval(MMcar(form)); form = MMcdr(form); } while (!endp(form)); } else { vs_base = vs_top = top; vs_push(Cnil); } } init_conditional() { make_special_form("IF",Fif); make_special_form("COND",Fcond); make_special_form("CASE",Fcase); make_special_form("WHEN",Fwhen); make_special_form("UNLESS",Funless); sLotherwise = make_ordinary("OTHERWISE"); enter_mark_origin(&sLotherwise); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.