玛氪宕·梦魔(Markdown Memo),使用Markdown的云端备忘录,百度IFE的RIA启航班的不合格的作业,才……才没有什么阴谋呢!
源gitee链接https://gitee.com/arathi/MarkdownMemo?_from=gitee_search
				
			
			
		
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					408 lines
				
				13 KiB
			
		
		
			
		
	
	
					408 lines
				
				13 KiB
			| 
								 
											11 years ago
										 
									 | 
							
								<!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 caching scheme 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
							 | 
						||
| 
								 | 
							
								  end
							 | 
						||
| 
								 | 
							
								end method as;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define sealed sideways method as
							 | 
						||
| 
								 | 
							
								    (class :: subclass(<locator>), string :: <string>)
							 | 
						||
| 
								 | 
							
								 => (locator :: <locator>)
							 | 
						||
| 
								 | 
							
								  let locator = element($string-to-locator-cache, string, default: #f);
							 | 
						||
| 
								 | 
							
								  if (instance?(locator, class))
							 | 
						||
| 
								 | 
							
								    locator
							 | 
						||
| 
								 | 
							
								  else
							 | 
						||
| 
								 | 
							
								    let locator = string-as-locator(class, string);
							 | 
						||
| 
								 | 
							
								    if ($cache-locators?)
							 | 
						||
| 
								 | 
							
								      element($string-to-locator-cache, string) := locator;
							 | 
						||
| 
								 | 
							
								    else
							 | 
						||
| 
								 | 
							
								      locator
							 | 
						||
| 
								 | 
							
								    end
							 | 
						||
| 
								 | 
							
								  end
							 | 
						||
| 
								 | 
							
								end method as;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// Locator conditions
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define class <locator-error> (<format-string-condition>, <error>)
							 | 
						||
| 
								 | 
							
								end class <locator-error>;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define function locator-error
							 | 
						||
| 
								 | 
							
								    (format-string :: <string>, #rest format-arguments)
							 | 
						||
| 
								 | 
							
								  error(make(<locator-error>, 
							 | 
						||
| 
								 | 
							
								             format-string:    format-string,
							 | 
						||
| 
								 | 
							
								             format-arguments: format-arguments))
							 | 
						||
| 
								 | 
							
								end function locator-error;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// Useful locator protocols
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define open generic locator-test
							 | 
						||
| 
								 | 
							
								    (locator :: <directory-locator>) => (test :: <function>);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define method locator-test
							 | 
						||
| 
								 | 
							
								    (locator :: <directory-locator>) => (test :: <function>)
							 | 
						||
| 
								 | 
							
								  \=
							 | 
						||
| 
								 | 
							
								end method locator-test;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define open generic locator-might-have-links?
							 | 
						||
| 
								 | 
							
								    (locator :: <directory-locator>) => (links? :: <boolean>);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define method locator-might-have-links?
							 | 
						||
| 
								 | 
							
								    (locator :: <directory-locator>) => (links? :: singleton(#f))
							 | 
						||
| 
								 | 
							
								  #f
							 | 
						||
| 
								 | 
							
								end method locator-might-have-links?;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define method locator-relative?
							 | 
						||
| 
								 | 
							
								    (locator :: <file-locator>) => (relative? :: <boolean>)
							 | 
						||
| 
								 | 
							
								  let directory = locator.locator-directory;
							 | 
						||
| 
								 | 
							
								  ~directory | directory.locator-relative?
							 | 
						||
| 
								 | 
							
								end method locator-relative?;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define method current-directory-locator?
							 | 
						||
| 
								 | 
							
								    (locator :: <directory-locator>) => (current-directory? :: <boolean>)
							 | 
						||
| 
								 | 
							
								  locator.locator-relative?
							 | 
						||
| 
								 | 
							
								    & locator.locator-path = #[#"self"]
							 | 
						||
| 
								 | 
							
								end method current-directory-locator?;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define method locator-directory
							 | 
						||
| 
								 | 
							
								    (locator :: <directory-locator>) => (parent :: false-or(<directory-locator>))
							 | 
						||
| 
								 | 
							
								  let path = 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?)
							 | 
						||
| 
								 | 
							
								  end
							 | 
						||
| 
								 | 
							
								end method locator-directory;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// Simplify locator
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define open generic simplify-locator
							 | 
						||
| 
								 | 
							
								    (locator :: <physical-locator>)
							 | 
						||
| 
								 | 
							
								 => (simplified-locator :: <physical-locator>);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define method simplify-locator
							 | 
						||
| 
								 | 
							
								    (locator :: <directory-locator>)
							 | 
						||
| 
								 | 
							
								 => (simplified-locator :: <directory-locator>)
							 | 
						||
| 
								 | 
							
								  let path = locator.locator-path;
							 | 
						||
| 
								 | 
							
								  let relative? = locator.locator-relative?;
							 | 
						||
| 
								 | 
							
								  let resolve-parent? = ~locator.locator-might-have-links?;
							 | 
						||
| 
								 | 
							
								  let simplified-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?)
							 | 
						||
| 
								 | 
							
								  else
							 | 
						||
| 
								 | 
							
								    locator
							 | 
						||
| 
								 | 
							
								  end
							 | 
						||
| 
								 | 
							
								end method simplify-locator;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define method simplify-locator
							 | 
						||
| 
								 | 
							
								    (locator :: <file-locator>) => (simplified-locator :: <file-locator>)
							 | 
						||
| 
								 | 
							
								  let directory = locator.locator-directory;
							 | 
						||
| 
								 | 
							
								  let simplified-directory = directory & simplify-locator(directory);
							 | 
						||
| 
								 | 
							
								  if (directory ~= simplified-directory)
							 | 
						||
| 
								 | 
							
								    make(object-class(locator),
							 | 
						||
| 
								 | 
							
								         directory: simplified-directory,
							 | 
						||
| 
								 | 
							
								         base:      locator.locator-base,
							 | 
						||
| 
								 | 
							
								         extension: locator.locator-extension)
							 | 
						||
| 
								 | 
							
								  else
							 | 
						||
| 
								 | 
							
								    locator
							 | 
						||
| 
								 | 
							
								  end
							 | 
						||
| 
								 | 
							
								end method simplify-locator;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// Subdirectory locator
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define open generic subdirectory-locator
							 | 
						||
| 
								 | 
							
								    (locator :: <directory-locator>, #rest sub-path)
							 | 
						||
| 
								 | 
							
								 => (subdirectory :: <directory-locator>);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define method subdirectory-locator
							 | 
						||
| 
								 | 
							
								    (locator :: <directory-locator>, #rest sub-path)
							 | 
						||
| 
								 | 
							
								 => (subdirectory :: <directory-locator>)
							 | 
						||
| 
								 | 
							
								  let old-path = locator.locator-path;
							 | 
						||
| 
								 | 
							
								  let new-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?)
							 | 
						||
| 
								 | 
							
								end method subdirectory-locator;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// Relative locator
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define open generic relative-locator
							 | 
						||
| 
								 | 
							
								    (locator :: <physical-locator>, from-locator :: <physical-locator>)
							 | 
						||
| 
								 | 
							
								 => (relative-locator :: <physical-locator>);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define method relative-locator
							 | 
						||
| 
								 | 
							
								    (locator :: <directory-locator>, from-locator :: <directory-locator>)
							 | 
						||
| 
								 | 
							
								 => (relative-locator :: <directory-locator>)
							 | 
						||
| 
								 | 
							
								  let path = locator.locator-path;
							 | 
						||
| 
								 | 
							
								  let from-path = from-locator.locator-path;
							 | 
						||
| 
								 | 
							
								  case
							 | 
						||
| 
								 | 
							
								    ~locator.locator-relative? & from-locator.locator-relative? =>
							 | 
						||
| 
								 | 
							
								      locator-error
							 | 
						||
| 
								 | 
							
								        ("Cannot find relative path of absolute locator %= from relative locator %=",
							 | 
						||
| 
								 | 
							
								         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);
							 | 
						||
| 
								 | 
							
								  end
							 | 
						||
| 
								 | 
							
								end method relative-locator;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define method relative-locator
							 | 
						||
| 
								 | 
							
								    (locator :: <file-locator>, from-directory :: <directory-locator>)
							 | 
						||
| 
								 | 
							
								 => (relative-locator :: <file-locator>)
							 | 
						||
| 
								 | 
							
								  let directory = locator.locator-directory;
							 | 
						||
| 
								 | 
							
								  let relative-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))
							 | 
						||
| 
								 | 
							
								  else
							 | 
						||
| 
								 | 
							
								    locator
							 | 
						||
| 
								 | 
							
								  end
							 | 
						||
| 
								 | 
							
								end method relative-locator;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define method relative-locator
							 | 
						||
| 
								 | 
							
								    (locator :: <physical-locator>, from-locator :: <file-locator>)
							 | 
						||
| 
								 | 
							
								 => (relative-locator :: <physical-locator>)
							 | 
						||
| 
								 | 
							
								  let from-directory = from-locator.locator-directory;
							 | 
						||
| 
								 | 
							
								  case
							 | 
						||
| 
								 | 
							
								    from-directory =>
							 | 
						||
| 
								 | 
							
								      relative-locator(locator, from-directory);
							 | 
						||
| 
								 | 
							
								    ~locator.locator-relative? =>
							 | 
						||
| 
								 | 
							
								      locator-error
							 | 
						||
| 
								 | 
							
								        ("Cannot find relative path of absolute locator %= from relative locator %=",
							 | 
						||
| 
								 | 
							
								         locator, from-locator);
							 | 
						||
| 
								 | 
							
								    otherwise =>
							 | 
						||
| 
								 | 
							
								      locator;
							 | 
						||
| 
								 | 
							
								  end
							 | 
						||
| 
								 | 
							
								end method relative-locator;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// Merge locators
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define open generic merge-locators
							 | 
						||
| 
								 | 
							
								    (locator :: <physical-locator>, from-locator :: <physical-locator>)
							 | 
						||
| 
								 | 
							
								 => (merged-locator :: <physical-locator>);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// Merge locators
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define method merge-locators
							 | 
						||
| 
								 | 
							
								    (locator :: <directory-locator>, from-locator :: <directory-locator>)
							 | 
						||
| 
								 | 
							
								 => (merged-locator :: <directory-locator>)
							 | 
						||
| 
								 | 
							
								  if (locator.locator-relative?)
							 | 
						||
| 
								 | 
							
								    let path = 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?))
							 | 
						||
| 
								 | 
							
								  else
							 | 
						||
| 
								 | 
							
								    locator
							 | 
						||
| 
								 | 
							
								  end
							 | 
						||
| 
								 | 
							
								end method merge-locators;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define method merge-locators
							 | 
						||
| 
								 | 
							
								    (locator :: <file-locator>, from-locator :: <directory-locator>)
							 | 
						||
| 
								 | 
							
								 => (merged-locator :: <file-locator>)
							 | 
						||
| 
								 | 
							
								  let directory = locator.locator-directory;
							 | 
						||
| 
								 | 
							
								  let merged-directory 
							 | 
						||
| 
								 | 
							
								    = if (directory)
							 | 
						||
| 
								 | 
							
								        merge-locators(directory, from-locator)
							 | 
						||
| 
								 | 
							
								      else
							 | 
						||
| 
								 | 
							
								        simplify-locator(from-locator)
							 | 
						||
| 
								 | 
							
								      end;
							 | 
						||
| 
								 | 
							
								  if (merged-directory ~= directory)
							 | 
						||
| 
								 | 
							
								    make(object-class(locator),
							 | 
						||
| 
								 | 
							
								         directory: merged-directory,
							 | 
						||
| 
								 | 
							
								         base:      locator.locator-base,
							 | 
						||
| 
								 | 
							
								         extension: locator.locator-extension)
							 | 
						||
| 
								 | 
							
								  else
							 | 
						||
| 
								 | 
							
								    locator
							 | 
						||
| 
								 | 
							
								  end
							 | 
						||
| 
								 | 
							
								end method merge-locators;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define method merge-locators
							 | 
						||
| 
								 | 
							
								    (locator :: <physical-locator>, from-locator :: <file-locator>)
							 | 
						||
| 
								 | 
							
								 => (merged-locator :: <physical-locator>)
							 | 
						||
| 
								 | 
							
								  let from-directory = from-locator.locator-directory;
							 | 
						||
| 
								 | 
							
								  if (from-directory)
							 | 
						||
| 
								 | 
							
								    merge-locators(locator, from-directory)
							 | 
						||
| 
								 | 
							
								  else
							 | 
						||
| 
								 | 
							
								    locator
							 | 
						||
| 
								 | 
							
								  end
							 | 
						||
| 
								 | 
							
								end method merge-locators;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// Locator protocols
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define sideways method supports-open-locator?
							 | 
						||
| 
								 | 
							
								    (locator :: <file-locator>) => (openable? :: <boolean>)
							 | 
						||
| 
								 | 
							
								  ~locator.locator-relative?
							 | 
						||
| 
								 | 
							
								end method supports-open-locator?;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define sideways method open-locator
							 | 
						||
| 
								 | 
							
								    (locator :: <file-locator>, #rest keywords, #key, #all-keys)
							 | 
						||
| 
								 | 
							
								 => (stream :: <stream>)
							 | 
						||
| 
								 | 
							
								  apply(open-file-stream, locator, keywords)
							 | 
						||
| 
								 | 
							
								end method open-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>
							 |