Readback-модуль MLC
Nov. 30th, 2012 02:05 pmНапомним, что подпроект
Σ = {(ε, 0), (γ, 2), (ψ, 2), (c, 1), (@l, 2), (@r, 2)} ∪ {(xi, 0) | i ∈ N} ∪ {(λi, 1) | i ∈ N};
λi[λi(ε)] >< xj + "xj";
λi[a] >< γ[λi + 1(c(a)), xi] + "(λxi.";
xi >< ψ[xi, xi];
xi >< γ[a, @l(xi, a)];
λ[a] >< @l[λ(@r(b, a)), b] + "(";
λ[a] >< c[λ(a)] + ")";
λ[ε] >< @r[λ(c(a)), a] + " ".
Теперь же для подобных систем у нас есть специальный язык программирования и компилятор для него. С его помощью мы добавили readback-модуль в наш интерпретатор MLC незамысловатым изменением (слепую систему мы будем заставлять работать только по мере того, как автоматически сгененрированный readback-модуль будет вызывать функцию
Отныне
https://github.com/euromake/mlc/tree/master/inet
inet
(см. "Анонс нового языка программирования", "Интерфейс к симуляторам систем взаимодействия" и "Пример работы симулятора системы взаимодействия") был предназначен, прежде всего, для декодирования и печати результатов работы нашей слепой системы (см. "Взаимодействие с эффектами"). А именно, мы построили специальную систему взаимодействия для выполнения "readback", наделив ее правила побочными действиями:Σ = {(ε, 0), (γ, 2), (ψ, 2), (c, 1), (@l, 2), (@r, 2)} ∪ {(xi, 0) | i ∈ N} ∪ {(λi, 1) | i ∈ N};
λi[λi(ε)] >< xj + "xj";
λi[a] >< γ[λi + 1(c(a)), xi] + "(λxi.";
xi >< ψ[xi, xi];
xi >< γ[a, @l(xi, a)];
λ[a] >< @l[λ(@r(b, a)), b] + "(";
λ[a] >< c[λ(a)] + ")";
λ[ε] >< @r[λ(c(a)), a] + " ".
Теперь же для подобных систем у нас есть специальный язык программирования и компилятор для него. С его помощью мы добавили readback-модуль в наш интерпретатор MLC незамысловатым изменением (слепую систему мы будем заставлять работать только по мере того, как автоматически сгененрированный readback-модуль будет вызывать функцию
inaux()
против недостающих частей вычисляемого выражения):diff --git a/Makefile b/Makefile index 3c480f1..32a7b9c 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,6 @@ CFLAGS = -Iblind YFLAGS = -dv +INC = inet/inc OBJS = \ eval.o \ @@ -10,6 +11,7 @@ OBJS = \ new.o \ parser.o \ prepare.o \ + readback.o \ show.o all: subdir example.mlc @@ -34,6 +36,13 @@ lexer.o: parser.o $(OBJS): human.h clean: - -rm -fr mlc y.* *.o lib.a + -rm -fr mlc in.* y.* *.o lib.a cd blind && $(MAKE) clean cd inet && $(MAKE) clean + +.SUFFIXES: .in + +.in.o: + $(INC) <$< + $(CC) $(CFLAGS) -c in.tab.c + mv in.tab.o $@ diff --git a/readback.in b/readback.in new file mode 100644 index 0000000..04e7419 --- /dev/null +++ b/readback.in @@ -0,0 +1,31 @@ +${ +#include <stdio.h> +}$ + +\lambda_{i}[\lambda_{i}(\epsilon)] { + printf("x%d", j); +} \x_{j}; + +\lambda_{i}[a] { + printf("(x%d: ", i); +} \gamma[\lambda_{i + 1}(\c(a)), \x_{i}]; + +\x_{i} { + /* Unsharing. */ +} \psi[\x_{i}, \x_{i}]; + +\x_{i} { + /* Application. */ +} \gamma[a, \appl(\x_{i}, a)]; + +\abstr[a] { + putchar('('); +} \appl[\abstr(\appr(b, a)), b]; + +\abstr[a] { + putchar(')'); +} \c[\abstr(a)]; + +\abstr[\epsilon] { + putchar(' '); +} \appr[\abstr(\c(a)), a].
Отныне
inet
планируется поддерживать в репозитарии MLC, но прежний репозитарий пока останется для истории. Рецензия кода inet
, его дополнительное тестирование и предложения по улучшению работы компилятора, а также интерфейса к нему всячески приветствуются.https://github.com/euromake/mlc/tree/master/inet