http://tinyurl.com/q9x9k4c

module smm(clk, dst, src, idx, val);
	input clk;
	input [3:0] dst;
	input [3:0] src;
	output [7:0] idx;
	output [7:0] val;

	reg [7:0] ram [0:255];

	wire [7:0] map [0:15];

	assign map[0] = 8'b0;

	genvar i;

	generate
		for (i = 1; i < 16; i = i + 1) begin: anl
			if (i % 2)
				assign map[i] = map[i / 2] + 1;
			else
				assign map[i] = ram[map[i / 2]];
		end
	endgenerate

	assign idx = map[dst];
	assign val = map[src];

	always @(posedge clk)
		ram[idx] <= val;
endmodule

`ifdef SIM
module sim;
	reg clk = 1'b0;
	reg [3:0] dst = 4'b1;
	reg [3:0] src = 4'b1;

	wire [7:0] idx, val;

	smm blk(clk, dst, src, idx, val);

	always begin
		if ($time >= 20)
			$finish;

		#1 $display(val);
		#1 clk <= ~clk;
		#1 clk <= ~clk;
		#1 src <= 4'b101;
	end
endmodule
`endif
http://tinyurl.com/q7yhgjq

$ make
iverilog -Wall -DSIM -o comb comb.v
./comb
0381353f9 0 b2e09fd28ea2916f526a8dbb3a92235f0ddb9b0b1ccd0e7d9b5786f91b62031e
0381353fa 1 00000000627d0f02061ce63584c20662272c527d21f17dfaffb20d7de340423d
0381353fb 0 c90dd726ebe7c2770808fe574e85aba7e90ba2aea8998c70bcb24781d4010955
$ 
module brain (clk, sensor, effect);
	parameter nbit = 12;
	parameter size = 2 ** nbit;
 
	input clk;
	input [7:0] sensor;
	output [7:0] effect;
 
	reg sig [0:size - 1];
	reg trace [0:size - 1];
	reg [nbit - 1:0] ram [0:size - 1];
 
	assign effect[3:0] = {sig[3], sig[2], sig[1], sig[0]};
	assign effect[7:4] = {sig[7], sig[6], sig[5], sig[4]};
 
	integer i;
 
	initial for (i = 0; i < size; i = i + 1) begin
		trace[i] = 0;
		sig[i] = 0;
		ram[i] = i;
	end
 
	always @(posedge clk) begin
		for (i = 0; i < 8; i = i + 1)
			sig[ram[i]] <= sensor[i];
 
		for (i = 0; i < size; i = i + 1) begin
			case ({trace[i], sig[ram[i]]})
			2'b00: ram[i] <= ram[i] + 1;
			2'b01: sig[i] <= 1;
			2'b10: sig[i] <= 0;
			2'b11: ram[i] <= ram[i] - 1;
			endcase
 
			trace[i] <= sig[ram[i]];
		end
	end
endmodule
 
`ifdef SIM
module sim;
	reg clk = 0;
	reg [7:0] key;
	wire [7:0] led;
 
	brain core(clk, key, led);
 
	integer c;
 
	always begin
		c = $fgetc(32'h8000_0000);
		if (-1 == c)
			$finish;
 
		key = c[7:0];
		#1 clk = ~clk;
		#1 clk = ~clk;
		$displayb(led);
	end
endmodule
`endif
`define OPZ 4'b1111
`define OPA 4'b0001
`define OPL 4'b0010
`define OPN 4'b0100
`define OPS 4'b1000

`define BIT 15
`define SIZE (2 ** `BIT)

module ram0 (clk, op, led);
	input clk;
	input [3:0] op;
	output [7:0] led;

	reg [`BIT - 1:0] ram [0:`SIZE - 1];
	reg [`BIT - 1:0] n, z;

	assign led = z[7:0];

	always @(posedge clk) begin
		case (op)
		`OPZ: z = 0;
		`OPA: z = z + 1;
		`OPL: z = ram[z];
		`OPN: n = z;
		`OPS: ram[n] = z;
		endcase
	end
endmodule

`ifdef SIM
module sim;
	reg clk = 0;
	reg [3:0] op;
	wire [7:0] led;

	ram0 core(clk, op, led);

	integer ch;

	always begin
		ch = $fgetc(32'h8000_0000);
		case (ch)
		"z", "Z": op = `OPZ;
		"a", "A": op = `OPA;
		"l", "L": op = `OPL;
		"n", "N": op = `OPN;
		"s", "S": op = `OPS;
		-1: $finish;
		default: op = 0;
		endcase

		if (op) begin
			#1 clk = ~clk;
			#1 clk = ~clk;
			$displayb(led);
		end
	end
endmodule
`endif
Программы на языке MLC (Macro Lambda Calculus) - пример доступен на GitHub - имеют следующий вид:

N1 = M1;
...
Nm = Mm;

M0.

Выражение M0 может содержать произвольное число вхождений имен макросов N1, ... , Nm, а также свободных переменных - обозначим их x1, ... , xn. Комбинатор M, нормальную форму которого мы фактически ищем, получается из программы следующим образом:

M = x1, ... , xn: (N1, ... , Nm: M0) M1 ... Mm.

Комбинатор M, в свою очередь, представим в исчислении взаимодействия, воспользовавшись направленной версией компактной кодировки λ-выражений. Заметим, что конфигурация <x | Γ(M, x)>, как можно видеть из определения, содержит только редексы по левому разыменованию. Следовательно, чтобы инициализировать нашу систему слепой перезаписи графов, достаточно все уравнения конфигурации положить в стек, соответствующий левому разыменованию.

Полученную в результате структуру памяти можно восстановить некоторой последовательностью I инструкций Z, A, L, N и S машины RAM0. Основной цикл работы нашей системы слепой перезаписи графов, реализующей редукцию сетей взаимодействия, также может быть представлен некоторой последовательностью R инструкций Z, A, L, N и S, которая не зависит от вычисляемого выражения. Таким образом, исходный код на языке MLC может быть скомпилирован в следующую программу RAM0:

I;
loop: R;
goto loop;

Данная программа не содержит инструкцию C для условного перехода. Такие детали, как стратегия вычисления, остановка машины, обработка дна стеков и механизм "read-back" во время стягивания конфигурации, были здесь намеренно опущены, чтобы не нагромождать и без того уже объемное изложение.
$ cat hex 
02000000
f40457b1
d005aeec
6e4fe577
f2a76dc3
73ef8901
220376b7
2b6de55a
00000000
bdcb52b0
9c48d2ee
26a513cb
cead7fb7
7daf4cef
9e2ab83b
bb9eb6b0
a7f5f990
fd270c51
378a0e1c
381353fa
$ xxd -r -p hex data
$ shasum -a 256 data >hash1
$ xxd -r -p hash1 bin
$ shasum -a 256 bin
e340423dffb20d7d21f17dfa272c527d84c20662061ce635627d0f0200000000  bin
$
http://www.knosof.co.uk/poschk.html

Applications POSIX.1 conformance testing

Derek Jones
derek@knosof.co.uk
Knowledge Software Ltd
Farnborough, Hants
UK


ABSTRACT

The Standards for POSIX and C were designed to enable the portability of applications across platforms. A lot of work has gone into checking compilers and environments for conformance to these Standards, but almost nothing has been done to check applications conformance. The incorrect assumption being made that the development compiler will warn about any construct that needs looking at. This paper discusses a tool that checks applications software for conformance to these Standards at compile, link and runtime as well as the library interface. Any application that can pass through this checker without producing any warnings is a conforming POSIX program and a strictly conforming C program.

© Copyright 1992,95. Knowledge Software Ltd. All rights reserved;

Presented at the EurOpen & USENIX Spring 1992 Workshop/Conference
This is how you perform word expansions using wordexp() system interface:

alexo@kuha:~/wordexp$ make
        cc    -o wordexp wordexp.c
        ./wordexp
echo hello world
0: 'echo'
1: 'hello'
2: 'world'
"\$HOME = $HOME" '$PWD'\ =\ $PWD
0: '$HOME = /home/alexo'
1: '$PWD = /home/alexo/wordexp'
alexo@kuha:~/wordexp$

https://gist.github.com/4492253

Source )
This script was written on Solaris 11 running inside VirtualBox.

set -Cex

ROOT=/opt/euromake
DEFROUTER=10.0.2.2
NETWORK=17
MIN=10
MAX=99

cd $ROOT

mkdir -p vacant
for p in $(ls vacant); do
	test -d "vacant/$p"
	if echo $$ >"vacant/$p/lock"; then
		POOL=$p
		trap 'rm -f "vacant/$POOL/lock"' INT TERM EXIT
		break
	fi
done

test "$POOL" -ge "$MIN"
test "$POOL" -le "$MAX"

read ZONE <vacant/$POOL/next
test "$ZONE" -ge "$MIN"
test "$ZONE" -le "$MAX"

ZONENAME=$NETWORK.$POOL.$ZONE
ZONEPATH=/zones/clones/$NETWORK/$POOL/$ZONE

# Comment at your own risk!
echo \
zonecfg -z $ZONENAME <<-COMMIT
	create
	set zonepath=$ZONEPATH
	select anet linkname=net0
		set defrouter=$DEFROUTER
		set allowed-address=10.$ZONENAME
	COMMIT
echo \
zoneadm -z $ZONENAME clone origin # from /zones/origin

NEXT=$(($ZONE + 1))
if [ "$NEXT" -le "$MAX" ]; then
	echo $NEXT >|vacant/$POOL/next
	rm -f vacant/$POOL/lock
else
	mkdir -p full
	test ! -e "full/$POOL"
	mv vacant/$POOL full
fi

trap - INT TERM EXIT

Debugging )
dmitris-imac:~ dmvo$ telnet austin.local
Trying 192.168.1.2...
Connected to austin.
Escape character is '^]'.


SunOS 5.8

login: dmvo
Password: 
Last login: Mon Dec 10 20:07:36 from mac
Sun Microsystems Inc.   SunOS 5.8       Generic Patch   February 2004
$ uname -a
SunOS austin 5.8 Generic_108528-29 sun4u sparc SUNW,Ultra-5_10
$ df -kP .
Filesystem           1024-blocks        Used   Available Capacity  Mounted on
mac:/Users/dmvo/Desktop
                      1952363672   273263664  1678844008    14%    /home/dmvo
$ echo $PROJECTDIR
alexo
$ ls -al /export/home/alexo/src
total 6
drwxrwxr-x   3 alexo    staff        512 Dec 10 21:17 .
drwxr-xr-x  12 alexo    staff        512 Dec 10 18:40 ..
drwxrwxr-x   2 alexo    staff        512 Dec 10 20:50 SCCS
$ ls
$ ed
a 
# %W%

all: rip
        ./rip

clean:
        -rm -f rip
.
w Makefile
43
q
$ sccs create Makefile

Makefile:
1.1
7 lines
$ rm ,Makefile
$ ed
a
#include <stdio.h>

static const char version[] = "%W%";

int main()
{
        printf("R. I. P.\n");
        return 0;
}
.
w rip.c
121
q
$ sccs create rip.c

rip.c:
1.1
9 lines
$ rm ,rip.c
$ ls # The moment of truth!
$ make
sccs  get -s Makefile -GMakefile
sccs  get -s rip.c -Grip.c
cc    -o rip rip.c 
./rip
R. I. P.
$ what rip
rip:
        rip.c   1.1
        stdio.h 1.78    99/12/08 SMI
        stdio_iso.h     1.2     99/10/25 SMI
        feature_tests.h 1.18    99/07/26 SMI
        isa_defs.h      1.20    99/05/04 SMI
        va_list.h       1.12    99/05/04 SMI
        stdio_tag.h     1.3     98/04/20 SMI
        stdio_impl.h    1.8     99/06/10 SMI
$ which cc
/opt/SUNWspro/bin/cc
$ date # Guess why?
Mon Dec 10 20:51:35 EET 1984
$ exit
Connection closed by foreign host.
dmitris-imac:~ dmvo$ 
  • Английский язык.
  • Десятипальцевая печать.
    • Аппликатура.
    • Раскладка клавиатуры для левой руки и модификаторы справа.
    • Раскладка клавиатуры для правой руки и модификаторы слева.
    • Caps-lock.
  • E-mail.
    • Оформление писем.
      • Plain text.
      • Обращение, приветствие, введение.
      • Соответствующий языковой стиль текста.
      • Заключение и подпись.
      • Постскриптум и краткая подпись.
    • Carbon-copy и blind-carbon-copy.
    • Reply и reply-to-all.
    • Forwarding.
  • Базовые навыки работы с операционной системой
  • Элементы предметной области.
    • LaTeX.
    • Web.
    • Portable System Interface.
  • Практика программирования.
Напомним, что подпроект 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
Месяц назад мы анонсировали новый язык программирования. Чуть позже мы подготовили проектную документацию. Теперь же мы реализовали компилятор этого языка программирования. Ниже пример работы тестового приложения, которое задействует симулятор простой системы взаимодействия, автоматически сгенерированный из ее описания.

alexo@euromake:~/inet$ make
./inc <example.in
cc  -c in.tab.c
mv in.tab.o example.o
cc     test.c example.o   -o test
./test
fan_1 >< fan_2
inaux: rewires
inaux: returns
inaux: returns
inaux: returns
inaux: returns
erase >< fan_3
erase >< fan_3
erase >< erase
fan_3 >< fan_3
erase >< erase
alexo@euromake:~/inet$ 
#if 0
#include <stdbool.h>
#endif

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static enum bool {
	true = 0xdead, false = 0xbeaf
} bool;

static enum cast {
	const_cast,
	dynamic_cast,
	reinterpret_cast,
	static_cast
} cast;

static struct class {
	struct class *namespace;
	int explicit;
	int friend;
	int mutable;
	int private;
	int protected;
	int public;
	int virtual;
} class;

static catch()
{
	return 0;
}

static try()
{
	return 0;
}

static throw()
{
	return 0;
}

static delete()
{
	return 0;
}

static export()
{
	return 0;
}

static usage(str)
	const char *str;
{
	fprintf(stderr, "Usage: %s id type op\n", str);
	exit(EXIT_FAILURE);
}

main(argc, argv)
	char *argv[];
{
	void *new = &class;
	char *typeid, *typename, *operator;
	int this;
	int using;

	if (4 > argc)
		usage(argv[0]);

	class.namespace = new;
	typeid = argv[1];
	typename = argv[2];
	operator = argv[3];
	this = !strcmp(typename, "this");
	using = atoi(typeid);
	printf("ID#%d is %s\n", using, this ? "mine" : "yours");
	return 0;
}
https://gist.github.com/4139831

Вместо того, чтобы писать функцию, которая строит дерево, напишите функцию, генерирующую код, который строит это дерево. Более точно, определите функцию gen() так, чтобы она печатала код на Си в stdout и программа на выходе кодогенератора создавала то же самое дерево, что пришло в аргументе функции. Ниже некоторые детали:

alexo@euromake:/tmp$ git clone git://gist.github.com/4139831.git gentree
Cloning into gentree...
remote: Counting objects: 8, done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 8 (delta 1), reused 5 (delta 1)
Receiving objects: 100% (8/8), done.
Resolving deltas: 100% (1/1), done.
alexo@euromake:/tmp$ cd gentree/
alexo@euromake:/tmp/gentree$ make
cc     gentree.c   -o gentree
./gentree 0 >output.c
make output
make[1]: Entering directory `/tmp/gentree'
cc     output.c   -o output
make[1]: Leaving directory `/tmp/gentree'
[ 0 = $(./output) ]
alexo@euromake:/tmp/gentree$ git grep Grammar
gentree.c:/* Grammar: <tree> ::= '0' | '1' <tree> <tree>. */
alexo@euromake:/tmp/gentree$ make TEST=1101000
./gentree 1101000 >output.c
make output
make[1]: Entering directory `/tmp/gentree'
cc     output.c   -o output
make[1]: Leaving directory `/tmp/gentree'
[ 1101000 = $(./output) ]
make: *** [all] Error 1
alexo@euromake:/tmp/gentree$ git grep TODO
gentree.c:      /* TODO: print some code in stdout. */
alexo@euromake:/tmp/gentree$ vi gentree.c
#include <inttypes.h>
#include <stdint.h>
#include <stdio.h>

#define VOIDPTRF "(void *)0x%" PRIxPTR

main()
{
	printf("\t" VOIDPTRF "\n", (uintptr_t)main);
	return 0;
}

alexo@euromake:/tmp/voidptrf$ make
cc     voidptrf.c   -o voidptrf
./voidptrf
        (void *)0x80483c4
alexo@euromake:/tmp/voidptrf$  
This is how you convert C source code (or any other ASCII text) into strings in C using Shell.

make(1) rules:

all: verbatim.h

verbatim.h: txt2cs.sed def.h sim.c
	printf '#define %s \\\n%s\n\n' >$*.tmp \
		INDEF "$$(sed -f txt2cs.sed def.h)"
	printf '#define %s \\\n%s\n' >>$*.tmp \
		INSIM "$$(sed -f txt2cs.sed sim.c)"
	mv $*.tmp $@

clean:
	-rm -fr verbatim.h *.tmp

sed(1) script:

s/\\/\\\\/g
s/"/\\"/g
s/	/\\t/g

$!s/^\(.*\)$/	"\1\\n" \\/
$s/^\(.*\)$/	"\1\\n"/

Output )
Приняты следующие дизайнерские решения относительно автоматического генератора симуляторов систем взаимодействия (см. "Анонс нового языка программирования"). Некоторые детали проектной документации подлежат уточнению позднее.

Определения

Симулятором называется результат компиляции правил взаимодействия с побочными действиями, описанных на языке, заявленном ранее. Приложением называется внешняя программа, определяемая пользователем, которая использует симулятор через интерфейс, описанный ниже.

typedef struct {
  void *type;
  int index;
  void *aux[INAUXLEN];
} inagent;

extern const struct insign {
  void *offline;
  void *wire;
  void *type1;
  void *type2;
  ...
} insign;


Проект

1. Компилятор генерирует симулятор на языке ISO/IEC 9899:1999 за конечное время. Симулятор имеет один общий стек для всех активных пар. Симулятор предоставляет интерфейс приложению для проталкивания в вершину стека: void inpush(inagent *left, inagent *right). Только сам симулятор выталкивает вершину стека. Симулятор предоставляет интерфейс к запуску взаимодействия: void interact(void). Возврат из функции interact() происходит по достижении дна стека активных пар.

2. Симулятор вызывает внешнюю функцию inagent *inaux(void *aux, void *offline), определяемую приложением, чтобы получить ячейку, связанную своим главным портом с дополнительным портом aux. Значение аргумента берется только из массива aux в структуре inagent одного из агентов активной пары только на вершине стека. Симулятор не предполагает какой-либо структуры по адресу aux, никогда не разыменовывает его и использует аргумент функции inaux() исключительно в качестве идентификатора. Приложение полностью решает само, какой характер носит значение aux. Симулятор никогда не сохраняет возвращаемое значение функции и только копирует данные из памяти по этому адресу.

3. Сигнатура insign содержит поля offline, wire, type1, type2..., где type1, type2... - различные имена, участвующие в описании системы взаимодействия в виде \type1, \type2... Всем полям структуры insign присвоены различные целые значения. Если в описании системы взаимодействия участвует имя \offline, \wire или \special, где special - ключевое или зарезервированное слово ISO/IEC 9899:1999, результат компиляции неопределен.

4. Приложение определяет каждую связь между двумя дополнительными портами с порядковыми номерами a и b произвольных inagent alpha и inagent beta, соответственно, такой парой структур inagent left и inagent right, что insign.wire == left.type, insign.wire == right.type, left == right.aux[0], right == left.aux[0], left == alpha.aux[a] и right == beta.aux[b]. Если wire1 и wire2 - идентификаторы этих двух структур, то после вызова inaux(wire1, offline) симулятор ожидает, что последующий вызов inaux(wire2, unused) вернет указатель на такую структуру inagent agent, что agent.type == insign.offline и agent.aux[0] == offline. Если в описании одного правила имя соединения между двумя дополнительными портами используется один или более двух раз, результат компиляции неопределен.

5. Реализация компилятора может, но не обязана предоставлять опцию многопоточной обработки стека активных пар. В случае поддержки данной опции, реализация может затребовать дополнительные ограченения к приложению и побочным действиям правил взаимодействия.

Обоснование )

Интерфейс к симуляторам систем взаимодействия выбран по аналогии с теми в IEEE 1003.1-2008, что между утилитой yacc и приложениями, в том числе генерируемыми с помощью утилиты lex (см. "Interface to the Lexical Analyzer").
Чтобы упростить разработку симулятора нашей системы слепой перезаписи графов, мы подготовили проект нового языка программирования на основе нотации Lafont с описанием побочных действий на языке Си. По аналогии с yacc(1) и lex(1) выходными данными нашего компилятора будет модуль на языке Си. Синтаксис нашего языка программирования выбран близким к тому, как записываются правила взаимодействия в LaTeX.

    1 text: '$' CODE '$' rest

    2 rest: rule ';' rest
    3     | rule '.'

    4 rule: side CODE side

    5 side: cell
    6     | cell '[' list ']'

    7 tree: leaf
    8     | cell '(' list ')'

    9 list: tree
   10     | tree ',' list

   11 leaf: cell
   12     | NAME

   13 cell: '\\' NAME
   14     | '\\' NAME '_' CODE

Ниже пример программы на этом языке. Как видно по данному "Hello World", программы похожи по структуре к описанию парсеров и лексических анализаторов на yacc(1) и lex(1), с помощью которых и будет реализован компилятор нашего языка.

${
/* An example interaction system. */

#include <stdio.h>
}$

\fan_{i}[x, y] {
	printf("fan_%d >< fan_%d\n", i, j);
} \fan_{i}[x, y];

\fan_{i}[\fan_{i + j}(a, b), \fan_{i + j}(c, d)] {
	IFF(i != j);
	printf("fan_%d >< fan_%d\n", i, j);
} \fan_{j}[\fan_{i + j}(a, c), \fan_{i + j}(b, d)];

\erase {
	printf("erase >< fan_%d\n", j);
} \fan_{j}[\erase, \erase];

\erase {
	printf("erase >< erase\n");
} \erase.

https://github.com/codedot/inet
Это музыкой навеяло:

alexo@euromake:/tmp/and$ cat and.c
void *
true_(x, y)
void *x, *y;
{
        return x;
}

void *
false_(x, y)
void *x, *y;
{
        return y;
}

void *
bool_[] = {false_, true_};

void *
and(x, y)
void *(*x)(), *y;
{
        return x(y, x);
}

main(argc, argv)
char *argv[];
{
        int x = argv[1][0] - '0';
        int y = argv[2][0] - '0';

        return (true_ == and(bool_[x], bool_[y]));
}
alexo@euromake:/tmp/and$ cat Makefile
all: and
        ./and 0 0; echo $$?
        ./and 0 1; echo $$?
        ./and 1 0; echo $$?
        ./and 1 1; echo $$?

clean:
        -rm -f and
alexo@euromake:/tmp/and$ make
cc     and.c   -o and
./and 0 0; echo $?
0
./and 0 1; echo $?
0
./and 1 0; echo $?
0
./and 1 1; echo $?
1
alexo@euromake:/tmp/and$ 
Page generated Aug. 23rd, 2025 07:51 pm
Powered by Dreamwidth Studios