3 ms·
The whole thing is about 800 lines of C code so far, and I aim to get that lower. :) For one thing, I'm busy bootstrapping the Fexl parser into Fexl itself.
by fexl 16y ago
The whole thing is about 800 lines of C code so far, and I aim to get that lower. :) For one thing, I'm busy bootstrapping the Fexl parser into Fexl itself. It's really neat to be able to express executable concepts simply and completely like this:
# Parse a nested parenthesized expression.
\parse_nested =
(
\yes
\no
skip_char ch_lparen
(
parse_expr
(\expr skip_char ch_rparen (yes expr) no)
no
)
no
)
And it's simple to do either-or parsing like this:
# Parse a factor: either an id or a nested expression.
\parse_factor =
(
\yes
\no
parse_id (\id yes (var id));
parse_nested yes;
no
)
Even such mundane tasks as skipping white space and comments have a
satisfying elegance about them:
# Skip filler, including white space and comments.
\skip_filler =
(
\done
skip_space;
skip_comment
(skip_filler done)
done
)
- deleted 16y ago[deleted]
- fexl 16y agoOK, here's one more example of how to write a Fexl combinator. Back in 1924 the great Moses Schönfinkel demonstrated that all computable functions can be defined in terms of just two primitive functions: C (the constant function), and S (the fusion function). So here is the source code for S, the Mother of all functions: #include "node.h" #include "type_S.h" /* Fusion function (Verschmelzungfunktion) S x y z = ((x z) (y z)) */ static void step(void) { int f1 = pop(); int f2 = pop(); int f3 = pop(); if (!f3) return; set_pair(f3, P(R(f1),R(f3)), P(R(f2),R(f3))); } int type_S(void) { static int node = 0; if (node == 0) node = new_combinator(step); return node; }
- Imbue 16y agoNot sure if I am understanding this correctly. By bootstrapping, do you mean C does only the most basic syntax parsing, and then a fexl script (written in a basic fexl subset) does the more complete parsing? All this stuff is really neat. Your C code interface looks quite nice and clean. I hope you release some source code soon. And thanks for taking the time to write all this. Even though a lot of it is over my head, it's quite interesting. I'm really looking forward to playing around with it a bit and learning.
- fexl 16y agoThat was the general idea. But it's taken quite an interesting turn lately! Turns out I can parse Fexl one character at a time and build the closed executable form in a single pass as I go along -- thanks to a concept which I discovered several months ago but shelved as a mere curiosity at the time. But I'm sure using it now! I started a proper blog here: http://fexl.com/blog http://fexl.com/blog , but we can still use ycombinator.com for discussion.
- fexl 16y agoBy the way, the initial release of Fexl will take a very simple form: A Universal Filter. The "fexl" executable will be nothing more than a program which maps standard input to standard output. So it's a filter. But it's universal because it is Turing-equivalent, capable of performing any conceivable function from stdin to stdout. When Fexl runs, the first thing it does is read a Fexl function from standard input. The Fexl process then "becomes" that function, processing the tail of the input accordingly. Simple!
- fexl 16y agoI created a Fexl discussion group at http://groups.google.com/group/fexl http://groups.google.com/group/fexl . You can reach everything from http://fexl.com http://fexl.com, including the Blog and Discussion group.