Blame | Letzte Änderung | Log anzeigen | RSS feed
<!doctype html><title>CodeMirror: Dylan mode</title><meta charset="utf-8" /><link rel=stylesheet href="../../doc/docs.css"><link rel="stylesheet" href="../../lib/codemirror.css"><script src="../../lib/codemirror.js"></script><script src="../../addon/edit/matchbrackets.js"></script><script src="../../addon/comment/continuecomment.js"></script><script src="../../addon/comment/comment.js"></script><script src="dylan.js"></script><style type="text/css">.CodeMirror {border-top: 1px solid black;border-bottom: 1px solid black;}</style><div id=nav><a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a><ul><li><a href="../../index.html">Home</a><li><a href="../../doc/manual.html">Manual</a><li><a href="https://github.com/codemirror/codemirror">Code</a></ul><ul><li><a href="../index.html">Language modes</a><li><a class=active href="#">Dylan</a></ul></div><article><h2>Dylan mode</h2><div><textarea id="code" name="code"> Module: locators-internals Synopsis: Abstract modeling of locations Author: Andy Armstrong Copyright: Original Code is Copyright (c) 1995-2004 Functional Objects, Inc. All rights reserved. License: See License.txt in this distribution for details.Warranty: Distributed WITHOUT WARRANTY OF ANY KIND define open generic locator-server (locator ::<locator>) => (server :: false-or(<server-locator>)); define open generic locator-host (locator ::<locator>) => (host :: false-or(<string>)); define open generic locator-volume (locator ::<locator>) => (volume :: false-or(<string>)); define open generic locator-directory (locator ::<locator>) => (directory :: false-or(<directory-locator>)); define open generic locator-relative? (locator ::<locator>) => (relative? ::<boolean>); define open generic locator-path (locator ::<locator>) => (path ::<sequence>); define open generic locator-base (locator ::<locator>) => (base :: false-or(<string>)); define open generic locator-extension (locator ::<locator>) => (extension :: false-or(<string>)); /// Locator classes define open abstract class<directory-locator> (<physical-locator>) end class<directory-locator>; define open abstract class<file-locator> (<physical-locator>) end class<file-locator>; define method as (class ==<directory-locator>, string ::<string>) => (locator ::<directory-locator>) as(<native-directory-locator>, string) end method as; define method make (class ==<directory-locator>, #key server :: false-or(<server-locator>) = #f, path ::<sequence> = #[], relative? ::<boolean> = #f, name :: false-or(<string>) = #f) => (locator ::<directory-locator>) make(<native-directory-locator>, server: server, path: path, relative?: relative?, name: name) end method make; define method as (class ==<file-locator>, string ::<string>) => (locator ::<file-locator>) as(<native-file-locator>, string) end method as; define method make (class ==<file-locator>, #key directory :: false-or(<directory-locator>) = #f, base :: false-or(<string>) = #f, extension :: false-or(<string>) = #f, name :: false-or(<string>) = #f) => (locator ::<file-locator>) make(<native-file-locator>, directory: directory, base: base, extension: extension, name: name)end method make; /// Locator coercion //---*** andrewa: This cachingscheme doesn't work yet, so disable it. define constant $cache-locators?= #f; define constant $cache-locator-strings? = #f; define constant$locator-to-string-cache = make(<object-table>, weak: #"key"); define constant $string-to-locator-cache = make(<string-table>, weak: #"value"); define open generic locator-as-string (class:: subclass(<string>), locator ::<locator>) => (string ::<string>); define open generic string-as-locator (class:: subclass(<locator>), string ::<string>) => (locator ::<locator>); define sealed sideways method as(class :: subclass(<string>), locator ::<locator>) => (string ::<string>) let string = element($locator-to-string-cache,locator, default: #f);if (string) as(class,string) else let string= locator-as-string(class,locator); if ($cache-locator-strings?)element($locator-to-string-cache,locator) := string;else string end endend method as; definesealed sideways methodas (class :: subclass(<locator>), string ::<string>) => (locator ::<locator>) let locator= element($string-to-locator-cache,string,default:#f); if(instance?(locator,class))locatorelse letlocator= string-as-locator(class,string);if ($cache-locators?)element($string-to-locator-cache,string):= locator;else locatorend endend methodas; ///Locatorconditionsdefineclass<locator-error>(<format-string-condition>,<error>)endclass<locator-error>;definefunctionlocator-error(format-string::<string>,#restformat-arguments)error(make(<locator-error>,format-string:format-string,format-arguments:format-arguments))endfunctionlocator-error;///Usefullocatorprotocolsdefineopengenericlocator-test(locator::<directory-locator>)=>(test::<function>);definemethodlocator-test(locator::<directory-locator>)=>(test::<function>)\=endmethodlocator-test;defineopengenericlocator-might-have-links?(locator::<directory-locator>)=>(links?::<boolean>);definemethodlocator-might-have-links?(locator::<directory-locator>)=>(links?::singleton(#f))#fendmethodlocator-might-have-links?;definemethodlocator-relative?(locator::<file-locator>)=>(relative?::<boolean>)letdirectory=locator.locator-directory;~directory|directory.locator-relative?endmethodlocator-relative?;definemethodcurrent-directory-locator?(locator::<directory-locator>)=>(current-directory?::<boolean>)locator.locator-relative?&locator.locator-path=#[#"self"]endmethodcurrent-directory-locator?;definemethodlocator-directory(locator::<directory-locator>)=>(parent::false-or(<directory-locator>))letpath=locator.locator-path;unless(empty?(path))make(object-class(locator),server:locator.locator-server,path:copy-sequence(path,end:path.size-1),relative?:locator.locator-relative?)endendmethodlocator-directory;///Simplifylocatordefineopengenericsimplify-locator(locator::<physical-locator>)=>(simplified-locator::<physical-locator>);definemethodsimplify-locator(locator::<directory-locator>)=>(simplified-locator::<directory-locator>)letpath=locator.locator-path;letrelative?=locator.locator-relative?;letresolve-parent?=~locator.locator-might-have-links?;letsimplified-path=simplify-path(path,resolve-parent?:resolve-parent?,relative?:relative?);if(path~=simplified-path)make(object-class(locator),server:locator.locator-server,path:simplified-path,relative?:locator.locator-relative?)elselocatorendendmethodsimplify-locator;definemethodsimplify-locator(locator::<file-locator>)=>(simplified-locator::<file-locator>)letdirectory=locator.locator-directory;letsimplified-directory=directory&simplify-locator(directory);if(directory~=simplified-directory)make(object-class(locator),directory:simplified-directory,base:locator.locator-base,extension:locator.locator-extension)elselocatorendendmethodsimplify-locator;///Subdirectorylocatordefineopengenericsubdirectory-locator(locator::<directory-locator>,#restsub-path)=>(subdirectory::<directory-locator>);definemethodsubdirectory-locator(locator::<directory-locator>,#restsub-path)=>(subdirectory::<directory-locator>)letold-path=locator.locator-path;letnew-path=concatenate-as(<simple-object-vector>,old-path,sub-path);make(object-class(locator),server:locator.locator-server,path:new-path,relative?:locator.locator-relative?)endmethodsubdirectory-locator;///Relativelocatordefineopengenericrelative-locator(locator::<physical-locator>,from-locator::<physical-locator>)=>(relative-locator::<physical-locator>);definemethodrelative-locator(locator::<directory-locator>,from-locator::<directory-locator>)=>(relative-locator::<directory-locator>)letpath=locator.locator-path;letfrom-path=from-locator.locator-path;case~locator.locator-relative?&from-locator.locator-relative?=>locator-error("Cannotfindrelativepathofabsolutelocator%=fromrelativelocator%=",locator,from-locator);locator.locator-server~=from-locator.locator-server=>locator;path=from-path=>make(object-class(locator),path:vector(#"self"),relative?:#t);otherwise=>make(object-class(locator),path:relative-path(path,from-path,test:locator.locator-test),relative?:#t);endendmethodrelative-locator;definemethodrelative-locator(locator::<file-locator>,from-directory::<directory-locator>)=>(relative-locator::<file-locator>)letdirectory=locator.locator-directory;letrelative-directory=directory&relative-locator(directory,from-directory);if(relative-directory~=directory)simplify-locator(make(object-class(locator),directory:relative-directory,base:locator.locator-base,extension:locator.locator-extension))elselocatorendendmethodrelative-locator;definemethodrelative-locator(locator::<physical-locator>,from-locator::<file-locator>)=>(relative-locator::<physical-locator>)letfrom-directory=from-locator.locator-directory;casefrom-directory=>relative-locator(locator,from-directory);~locator.locator-relative?=>locator-error("Cannotfindrelativepathofabsolutelocator%=fromrelativelocator%=",locator,from-locator);otherwise=>locator;endendmethodrelative-locator;///Mergelocatorsdefineopengenericmerge-locators(locator::<physical-locator>,from-locator::<physical-locator>)=>(merged-locator::<physical-locator>);///Mergelocatorsdefinemethodmerge-locators(locator::<directory-locator>,from-locator::<directory-locator>)=>(merged-locator::<directory-locator>)if(locator.locator-relative?)letpath=concatenate(from-locator.locator-path,locator.locator-path);simplify-locator(make(object-class(locator),server:from-locator.locator-server,path:path,relative?:from-locator.locator-relative?))elselocatorendendmethodmerge-locators;definemethodmerge-locators(locator::<file-locator>,from-locator::<directory-locator>)=>(merged-locator::<file-locator>)letdirectory=locator.locator-directory;letmerged-directory=if(directory)merge-locators(directory,from-locator)elsesimplify-locator(from-locator)end;if(merged-directory~=directory)make(object-class(locator),directory:merged-directory,base:locator.locator-base,extension:locator.locator-extension)elselocatorendendmethodmerge-locators;definemethodmerge-locators(locator::<physical-locator>,from-locator::<file-locator>)=>(merged-locator::<physical-locator>)letfrom-directory=from-locator.locator-directory;if(from-directory)merge-locators(locator,from-directory)elselocatorendendmethodmerge-locators;///Locatorprotocolsdefinesidewaysmethodsupports-open-locator?(locator::<file-locator>)=>(openable?::<boolean>)~locator.locator-relative?endmethodsupports-open-locator?;definesidewaysmethodopen-locator(locator::<file-locator>,#restkeywords,#key,#all-keys)=>(stream::<stream>)apply(open-file-stream,locator,keywords)endmethodopen-locator;</textarea></div><script>var editor = CodeMirror.fromTextArea(document.getElementById("code"),{mode: "text/x-dylan",lineNumbers: true,matchBrackets: true,continueComments: "Enter",extraKeys:{"Ctrl-Q": "toggleComment"},tabMode: "indent",indentUnit: 2});</script><p><strong>MIME types defined:</strong> <code>text/x-dylan</code>.</p></article>