diff --git a/cirilisp.c b/cirilisp.c index 8643447..0ff08ac 100644 --- a/cirilisp.c +++ b/cirilisp.c @@ -80,6 +80,7 @@ void init() addSymbolInternal("примени", &applyInt, 0); addSymbolInternal("прикажи", &displayInt, 0); addSymbolInternal("штампај", &printInt, 0); + addSymbolInternal("читај", &readInt, 0); addSymbolInternal("почни", &beginInt, 0); addSymbolInternal("баци", &throwInt, 0); addSymbolInternal("направи-ниску", &makeStrInt, 0); diff --git a/internals.c b/internals.c index 2222391..1a335af 100644 --- a/internals.c +++ b/internals.c @@ -792,6 +792,16 @@ object printInt(object parameters) return copyObject(CAR(parameters)); } +object readInt(object parameters) +{ + if (listLength(parameters) != 0) + { + SIGERR(argumentNumberError); + } + + return Read("", stdin); +} + object beginInt(object parameters) { object last; diff --git a/internals.h b/internals.h index c45720a..6604466 100644 --- a/internals.h +++ b/internals.h @@ -36,6 +36,7 @@ object eqvQInt(object parameters); object applyInt(object parameters, env currentEnv); object displayInt(object parameters); object printInt(object parameters); +object readInt(object parameters); object beginInt(object parameters); object throwInt(object parameters); object makeStrInt(object parameters); diff --git a/инит.ћ b/инит.ћ index bd0d022..d9a11c8 100644 --- a/инит.ћ +++ b/инит.ћ @@ -60,11 +60,34 @@ (листа 'ако (саар клаузе) (ако (нил? (сдар клаузе)) (саар клаузе) - (листа 'примени 'почни - (листа 'навод (сдар клаузе)))) + (конс 'почни (сдар клаузе))) (ако (нил? (сдр клаузе)) () (примени услов (сдр клаузе))))))) -(опиши (цеоброј? џ) +(опиши (мапирај процедура листа) + (услов + ((није (листа? листа)) (баци "Функција се не може мапирати\ + на не-листу")) + ((није (процедура? процедура)) (баци "Не може се мапирати\ +не-функција")) + ((нил? листа) ()) + (#и (конс + (процедура (сар листа)) + (мапирај процедура (сдр листа)))))) + +(опиши-складњу (нека листа-променљивих . тело) + (опиши (валидна-нека-листа-променљивих листа) + (опиши (дужине2 листа) + (= (дужина листа) 2)) + (примени и (мапирај дужине2 листа))) + (ако (није (валидна-нека-листа-променљивих листа-променљивих)) + (баци "Невалидна листа променљивих за \"нека\" процедуру") + (почни + (опиши имена (мапирај сар листа-променљивих)) + (опиши вредности (мапирај садр листа-променљивих)) + (опиши ламбда-израз (надовежи (листа 'ламбда имена) тело)) + (конс ламбда-израз вредности)))) + +(опиши (цео-број? џ) (= (именилац (нетачно->тачно џ)) 1))