Nov. 30th, 2012

Напомним, что подпроект inet (см. "Анонс нового языка программирования", "Интерфейс к симуляторам систем взаимодействия" и "Пример работы симулятора системы взаимодействия") был предназначен, прежде всего, для декодирования и печати результатов работы нашей слепой системы (см. "Взаимодействие с эффектами"). А именно, мы построили специальную систему взаимодействия для выполнения "readback", наделив ее правила побочными действиями:

Σ = {(ε, 0), (γ, 2), (ψ, 2), (c, 1), (@l, 2), (@r, 2)} ∪ {(xi, 0) | i ∈ N} ∪ {(λi, 1) | i ∈ N};

λii(ε)] >< 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

Profile

Anton Salikhmetov

November 2018

S M T W T F S
    123
45678 910
11121314151617
18192021222324
252627282930 

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 9th, 2025 08:53 am
Powered by Dreamwidth Studios