Spawned from
WikiPlacenameProblem by this comment:
Actually, a "reflective" Wiki which could be used to alter its own source code would be a very worthwhile thing. On the other hand, it is also most definitely and absolutely certainly a stupid idea and one that couldn't possibly work, ever ever. On the gripping hand an ObjectOrientedWiki could certainly work. Combine that with ManaMana and one might have a TarBaby. Hmm. --
PeterMerel
Hence the
ReflectiveWiki is an idea or suggestion for yet another
WikiEngine.
Which technology? How would it work?
Well, it seems obvious that you would need a strong sandbox.
You would probably need some automatic version control, such that the system could automatically roll back changes which cause it to malfunction.
Supposing each "page" had a
UnitTest, you then have a hook for your version control - if the change you are making will break the
ReflectiveWiki, then you must commit to a branch.
Of course, that would be
VersionControlAppliedToWiki gone mad.
I don't think such a thing is necessary. Just provide some rudimentary scripts (eg show and edit) that cannot be altered, but usually use other (reflective) interfaces to the wiki. Make an exception handler that points the user directly to the non-alterable edit script on the right file.
Likely side effects
I can see that this system is not going to be popular with the casual
WikiZen.
SelfModifyingCode is often
ConsideredHarmful, so I can see that the average contributor is likely to be a hacker with a twisted mind. Hence the
ReflectiveWiki would have some amazing features, but few will be able to understand or use them.
In case there was still some doubt, it would nicely underline the fact that
CodeIsSpeech (in the
ProtectedByAmericanConstitution sense. See also
DigitalMillenniumCopyrightAct).
There could be problems with ensuring that the code compiles. OK, you could check that at submission time, unless "do" or "use" are allowed to include other pages - you don't want to have to "perl -wc" the whole site each time.
Then there is the
HaltingProblem. Solve that and you're on to a winner! 8->
Examples
I started the page thinking the idea must be bonkers, but I'm not so sure now. --
MatthewAstley
See also
WikiEngines and
WikiEnginesWanted
Well, you don't actually need to build all that much. Start with a plain vanilla Wiki. You could just add some special
TextFormattingRules to mark those areas that are
ReflectiveWiki code. Then a small script can be run whenever "save" is pressed to strip out all lines of
ReflectiveWiki text into a file.
A
UserModeLinux sandbox can run the actual
ReflectiveWiki.
Of course that leaves one wondering about a
MetaReflectiveWiki...
A
ReflectiveWiki could also just have one layer that users could edit for instance using
PrologLanguage to assert facts and rules, and query them, and another underlying layer (in perl, java or whatever) that would not be user modifyable. Perhaps with import/export from/to RDF. Most
SemanticWeb/
SemanticWiki/
RdfWiki sites seem just about storing facts a
ReflectiveWiki could allow inference on the facts. So even if the knowledge/rulebase got deleted or mangled it could be repaired by users from recent edits the basic functionality to allow viewing, adding, editing would not be affected.
For instance
http://easytopicmaps.com/index.php?page=BeerTM describes an ontology for Beer and
http://www.ontopia.net/~grove/beer/notes.txt even has breakdowns by country but nowhere does it let a user type for instance
beer(seasonals,'by event',X) to query what another user(s) has entered.
An online example showing what is possible can be tried by going to
http://logic.csci.unt.edu/bp_inet/cgi/query_frame.html copy and paste the following (derived from the .txt above)-
Paste in "Query Interpreter":
beer(seasonals,'by event',X)
Paste in "Quick Online Editor":
beer(seasonals,'by season',
['christmas beers',
'easter beers',
'winter beers (belgian)',
'summer beers',
'saison (belgian, french)']).
beer(seasonals,'by month',
['m�rzen',
'maibock',
'oktoberfest']).
beer(seasonals,'by event',
['festbier']).
Then click the submit button the result is a bit hard to see but in the bottom frame scroll down a bit it should say
X=[festbier];
You could vary parameters and it would return results accordingly. In a
ReflectiveWiki with a prolog or other interpretive top layer one set of users could enter knowledge and rules and others query it to arbitrary levels of detail. See also an online prolog RDF parser demo at
http://www.swi.psy.uva.nl/projects/SWI-Prolog/packages/sgml/online.html
With that kind of interface users could combine queries to outside the wiki from RDF/RSS feeds See
http://bitsko.slc.ut.us/blog/feed-data.html. By using
UseModWiki and swi prolog (free with both unix and windows source) it should not be hard to do.
See also
AntiComment,
LukesProgrammableWiki