I've been working on a BBCode implementation myself. This is what I have so far (about three hours of work, I'd say): [foldr]
[d]asd [_][*]a[/*][*]b[/*][/_]
[add][_][*]$a[/*][*]$b[/*][/_][/add]
[/d]
0
[_][*]1[/*][*]2[/*][*]3[/*][/_]
[/foldr]
6
I suppose the syntax could need some fixin' ;) It's all really inconsistent. foldr and add are primitives (I also have a cudder primitive): prim_cudder fs ((BBList (_:xs)):_) = BBList xs
prim_add fs ((BBList ((BBInt a):(BBInt b):_)):_) = BBInt (a + b)
prim_foldr fs ((BBSymbol fn args body):x:(BBList xs):_) = foldr (\ a b -> (apply fs body (zip args [a, b]))) x xs
fap fap fap
>>40
I think that mixing executable BBCode seamlessly with normal world4ch posts in a non-asshatterish way is not possible. We need a top-level tag [prog] that separates executable segments from the rest of the post. The body of a [prog] tag would function like >>28 suggested. In the final post, [prog] segments would then be replaced with the results of evaluation.
>>42
That wouldn't be much different from what I said, really. In my case, only the top level is treated like regular posts, parsing newlines into <BR/> and so, while anything between [ and ] has Lisp semantics. Since current Shiichan BBCode defines simple tags which take no parameters or anything, they'll be compatible, provided we define b, /b, code, etc. to return proper HTML. In my case, these functions take no parameters and return HTML tags; it's not [b "bold code"] which would cause a lot of problems with recursive tags.
>>45
But your approach is ugly. [b] et al should be functions that take an arbitrary expression as argument and return the resulting string literal enclosed in an appropriate tag. For example [bee][add]3 [mod]5 2[/mod][/add][/bee]* would return 4.
* [b] replaced with [bee] because I don't remember how to escape BBCode.
Name:
Anonymous2007-09-13 14:17 ID:kiJ6xscN
And now for something related: how am I supposed to read ``properly quoted'' strings with Parsec? Normally this would be trivial, but this ``predictive'' fuckwittery of Parsec doesn't do things the way I want it to do.
My current parser is
bbstring = do string "``"
s <- many bbchar
string "''"
return $ String s
where ``bbchar'' just reads any character and escapes escapes. When it encounters an `''', it fucks up because it fails to recognize that as a closing quote. Any sane parser would simply backtrack, but Parsec is apparently designed to be really fucking fast and to not pay attention to such details. It has the try keyword that should do something like this, but I have no idea how to use it with many.
Name:
Anonymous2007-09-13 17:15 ID:2lxbdI5m
>>43
Okay, I changed the syntax around a little bit! This new syntax uses spaces in places for nicer lists, but it is more BBCodesque because it doesn't use $variables.
>>48
Well, at least this version doesn't induce that ``I CAN SEE FOREVER'' effect of your earlier effort, but you're still doing it wrong. >>28 got it right (if we add the [prog] tag). Your version is way too verbose and has completely useless misfeatures like the [var] tags.
>>49
I haven't decided how to handle strings yet, right now strings can't have spaces (or they are considered separate strings), if I decide to have a special syntax for strings I might drop [var], but I like it because it's really BBCodesque. I added some more primitives and got a recursive Fibonacci algorithm working (I actually didn't know I could call the functions from inside themselves, but now I know): [def] fib
[ls]n[/ls]
[if][equal][var]n[/var] 0[/equal]
0
[if][equal][var]n[/var] 1[/equal]
1
[add]
[fib][sub][var]n[/var] 1[/sub][/fib]
[fib][sub][var]n[/var] 2[/sub][/fib]
[/add]
[/if]
[/if]
[/def]
[fib]8[/fib]
Name:
Anonymous2007-09-13 19:28 ID:Oy/neyE+
>>48
Really, that's ENTERPRISE. Too fucking verbose. Looks like XML. Scheme BBCode is better: [define [map f l]
[if [equal? l []]
[]
[cons [f [car l]] [map f [cdr l]]]]]
[map [lambda [x] [+ x 1]] [list 1 2 3 4]]
>>51
Really, that's ENTERPRISE. Too fucking verbose. Looks like XML. Scheme BBCode is better: [define [fib x]
[if [< x 2]
x
[+ [fib [- x 1]] [fib [- x 2]]]]]
[fib 8]
Well if we find some syntax maybe we could use lex and yacc to write the interpreter?
It will be very funny if /prog/ actually manages to create a decent language.
>>52
Sure, that's shorter -- but it's not BBCode any more! That's just Scheme with [] instead of ().
And this is supposed to be an Enterprise-grade language -- otherwise it won't be picked up by the mainstream.
Name:
Anonymous2007-09-14 6:40 ID:5omKp7Uo
Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets Let's use R5RS with square brackets
Name:
Anonymous2007-09-14 8:55 ID:X3rOgp6f
screw bbcode. be an EXPERT WEB DEVELOPER and use the currently unfinished HTML 5 and CSS3.