a = b + c*e a = b.add(c.multiply(e))
javac
knock-off compiler espresso.
var l = new List[Color]()
("(" ~> expr <~ ")" <~ ";") ^^ DoLoop
A wiki provides directly editable web pages. Invented by Ward Cunningham in 1995. “Wiki wiki” is Hawaiian for “quick”. |
|
|
|
|
Wow, that's great! How can I get one? There are plenty of wikis available, but DIY is fun.
|
1: Serve pages (as normal).
2: Serve edit pages.
3: Store edited pages and serve them.
url/wiki?action=action&page=page
where
action
is eitheredit
orsubmit
.
page
is a page name.
url/wiki?action=edit&page=poem.html
main()
class Wiki { public static void main(String args[]) { final Map<String, String> input = getInput(args); final String page = input.get("page"); if (input.get("action").equals("edit")) doEdit(page); else doSubmit(page, input.get("pagesource"); } } // and so on }
main()
import java.util.Map import java.util.HashMap object Wiki { def main(args: Array[String]) { val input = getInput(args) val page = input.get("page") if (input.get("action").equals("edit")) doEdit(page) else doSubmit(page, input.get("pagesource") } // and so on }
main()
Observationsimport java.util.HashMap
val input = getInput(args)
Array
's a proper class.
def main(args: Array[String]) {
object Wiki { def main(args: Array[String]) {
class Wiki { // blah blah blah private static void doEdit(String pageName) { sendCGIResponse(makeEditPage(pageName)); } private static void doSubmit(String pageName, String pageSource) { writeWikiPage(pageName, pageSource); sendCGIResponse(makeWikiPage(pageName)); } // blah blah blah
object Wiki { // blah blah blah private def doEdit(pageName: String) { sendCGIResponse(makeEditPage(pageName)) } private def doSubmit(pageName: String, pageSource: String) { writeWikiPage(pageName, pageSource) sendCGIResponse(makeWikiPage(pageName)) } // blah blah blah
private def doEdit(pageName: String) {
class EditWikiPage extends HTMLPage implements SafeString { EditWikiPage(String fn) { super(fn); } EditWikiPage() { this(""); } public String decontaminate(String str, Sanitizer sfun) { // blah blah blah } // blah blah blah }
class EditPageWiki(fn: String) extends HTMLPage with SafeString { private val filename = fn def this() { this("") } // blah blah blah }
class EditWikiPage(fn: String) /* blah blah blah */ { private val filename = fn
def this() { this("") }
decontaminate()
?
John <script> ... </script> Doe
interface SafeString { // Return the string scrubbed of the // dangerous constructs defined in the // given sanitizer. String decontaminate( String str, Sanitizer sfun); } interface Sanitizer { String scrub(String str); }
trait SafeString { def decontaminate( str: String, sfun: Sanitizer) { // blah blah blah } } abstract class Sanitizer { def scrub(str: String): String }
SafeString
trait defines, not just declares,
decontaminate()
.
EditWikiPage
inherits it.
abstract class HTMLPage { void process(TagTransformer f) { List<HTMLTag> newPage = new ArrayList<HTMLTag>(); for (HTMLTag tag: page) { final HTMLTag newTag = f.munge(tag); if (newTag != null) newPage.add(newTag); } page = newPage; } } interface TagTransformer { HTMLTag munge(HTMLTag tag); }
page = page.transform( new TagTransformer() { public HTMLTag munge(HTMLTag tag) { return tag.isTag("script") ? null : tag; } } );
abstract class HTMLPage { def process(munge: HTMLTag => HTMLTag) { var newPage: List[HTMLTag] = List() for (tag <- page) { val newTag = munge(tag) if (newTag != null) newPage = newTag :: newPage } page = newPage } }
def process(munge: HTMLTag => HTMLTag) { val newTag = munge(tag)
var newPage: List[HTMLTag] = List()
newPage = newTag :: newPage
page = page.transform( (tag: HTMLTag) => if (tag.isTag("script")) null else tag)
or
val scrub = (tag: HTMLTag) => if (tag isTag "script") null else tag page = page.transform(scrub)
val scrub = (tag: HTMLTag) => if (tag isTag "script") null else tag
if (tag.isTag("script")) null else tag if (tag isTag "script") null else tag
def process(munge: HTMLTag => HTMLTag) { page = for (t <- page) yield munge(t) page = for (t <- page if t != null) yield t } def process(munge: HTMLTag => HTMLTag) { page = for (t <- (for (t <- page) yield munge(t)) if t != null) yield t }
www.scala-lang.com
.
www.drmaciver.com/planetscala/
.