Agda 2.2.0 → 2.2.2
raw patch · 75 files changed
+3382/−527 lines, 75 filesdep ~binarynew-component:exe:agda-mode
Dependency ranges changed: binary
Files
- Agda.cabal +36/−12
- README +216/−200
- src/agda-mode/Main.hs +190/−0
- src/data/emacs-mode/agda-input.el +817/−0
- src/data/emacs-mode/agda2-abbrevs.el +105/−0
- src/data/emacs-mode/agda2-highlight.el +314/−0
- src/data/emacs-mode/agda2-mode.el +1004/−0
- src/data/emacs-mode/agda2.el +13/−0
- src/data/emacs-mode/annotation.el +182/−0
- src/data/emacs-mode/eri.el +186/−0
- src/full/Agda/Compiler/Agate/Classify.hs +4/−4
- src/full/Agda/Compiler/Agate/OptimizedPrinter.hs +5/−5
- src/full/Agda/Compiler/Agate/TranslateName.hs +1/−1
- src/full/Agda/Compiler/Agate/UntypedPrinter.hs +1/−1
- src/full/Agda/Compiler/Alonzo/Haskell.hs +3/−3
- src/full/Agda/Compiler/Alonzo/Main.hs +24/−24
- src/full/Agda/Compiler/Alonzo/Names.hs +1/−1
- src/full/Agda/Compiler/Alonzo/PatternMonad.hs +4/−4
- src/full/Agda/Compiler/MAlonzo/Compiler.hs +4/−4
- src/full/Agda/Compiler/MAlonzo/Misc.hs +3/−3
- src/full/Agda/Compiler/MAlonzo/Primitives.hs +5/−5
- src/full/Agda/Interaction/BasicOps.hs +42/−42
- src/full/Agda/Interaction/CommandLine/CommandLine.hs +11/−11
- src/full/Agda/Interaction/Highlighting/HTML.hs +4/−4
- src/full/Agda/Interaction/Highlighting/Precise.hs +2/−2
- src/full/Agda/Interaction/Imports.hs +1/−1
- src/full/Agda/Interaction/Monad.hs +2/−2
- src/full/Agda/Interaction/Options.hs +13/−7
- src/full/Agda/Main.hs +4/−3
- src/full/Agda/Syntax/Concrete/Definitions.hs +2/−2
- src/full/Agda/Syntax/Concrete/Operators/Parser.hs +1/−1
- src/full/Agda/Syntax/Concrete/Pretty.hs +2/−2
- src/full/Agda/Syntax/Info.hs +1/−1
- src/full/Agda/Syntax/Internal.hs +7/−7
- src/full/Agda/Syntax/Parser/Monad.hs +1/−1
- src/full/Agda/Syntax/Parser/StringLiterals.hs +1/−1
- src/full/Agda/Syntax/Scope/Base.hs +1/−1
- src/full/Agda/Syntax/Translation/AbstractToConcrete.hs +2/−2
- src/full/Agda/Syntax/Translation/ConcreteToAbstract.hs +2/−2
- src/full/Agda/Syntax/Translation/InternalToAbstract.hs +1/−1
- src/full/Agda/Termination/CallGraph.hs +6/−6
- src/full/Agda/Termination/Matrix.hs +3/−3
- src/full/Agda/Termination/TermCheck.hs +16/−16
- src/full/Agda/Termination/Termination.hs +24/−24
- src/full/Agda/TypeChecking/Conversion.hs +1/−1
- src/full/Agda/TypeChecking/Coverage.hs +2/−2
- src/full/Agda/TypeChecking/Errors.hs +3/−5
- src/full/Agda/TypeChecking/Free.hs +1/−1
- src/full/Agda/TypeChecking/MetaVars.hs +2/−2
- src/full/Agda/TypeChecking/Monad/Base.hs +4/−5
- src/full/Agda/TypeChecking/Monad/Builtin.hs +1/−1
- src/full/Agda/TypeChecking/Monad/Closure.hs +1/−1
- src/full/Agda/TypeChecking/Monad/Env.hs +1/−1
- src/full/Agda/TypeChecking/Monad/MetaVars.hs +4/−4
- src/full/Agda/TypeChecking/Monad/Signature.hs +2/−2
- src/full/Agda/TypeChecking/Polarity.hs +1/−1
- src/full/Agda/TypeChecking/Positivity.hs +1/−1
- src/full/Agda/TypeChecking/Primitive.hs +1/−1
- src/full/Agda/TypeChecking/Reduce.hs +2/−2
- src/full/Agda/TypeChecking/Rules/Data.hs +1/−1
- src/full/Agda/TypeChecking/Rules/Def.hs +1/−1
- src/full/Agda/TypeChecking/Rules/LHS.hs +2/−2
- src/full/Agda/TypeChecking/Rules/LHS/Instantiate.hs +6/−6
- src/full/Agda/TypeChecking/Rules/Record.hs +2/−2
- src/full/Agda/TypeChecking/Serialise.hs +5/−5
- src/full/Agda/TypeChecking/SizedTypes.hs +4/−4
- src/full/Agda/TypeChecking/Substitute.hs +3/−3
- src/full/Agda/TypeChecking/Telescope.hs +1/−1
- src/full/Agda/TypeChecking/Test/Generators.hs +5/−5
- src/full/Agda/TypeChecking/With.hs +2/−2
- src/full/Agda/Utils/List.hs +1/−1
- src/full/Agda/Utils/ReadP.hs +8/−8
- src/full/Agda/Utils/Serialise.hs +1/−1
- src/full/Agda/Utils/Trie.hs +3/−3
- src/full/Agda/Utils/Warshall.hs +43/−43
Agda.cabal view
@@ -1,6 +1,6 @@ name: Agda-version: 2.2.0-cabal-version: >= 1.4 && < 2+version: 2.2.2+cabal-version: >= 1.6 && < 2 build-type: Simple license: OtherLicense license-file: LICENSE@@ -18,18 +18,33 @@ Emacs interface (the type checker can assist in the development of your code). .- Agda is a proof assistant: It is an interactive system for writing- and checking proofs. Agda is based on intuitionistic type theory, a- foundational system for constructive mathematics developed by the- Swedish logician Per Martin-Löf. It has many similarities with other- proof assistants based on dependent types, such as Coq, Epigram and- NuPRL.-tested-with: GHC == 6.8.3 && == 6.10.1+ Agda is also a proof assistant: It is an interactive system for+ writing and checking proofs. Agda is based on intuitionistic type+ theory, a foundational system for constructive mathematics developed+ by the Swedish logician Per Martin-Löf. It has many similarities+ with other proof assistants based on dependent types, such as Coq,+ Epigram and NuPRL.+ .+ Note that if you want to use the command-line program (agda), then+ you should also install the Agda-executable package. This package+ includes an Emacs mode for Agda, but you need to set up the Emacs+ mode yourself (see the README).+tested-with: GHC == 6.8.3 && == 6.10.2 extra-source-files: src/full/Agda/undefined.h README-data-dir: src/data-data-files: Agda.css+data-dir: src/data+data-files: Agda.css+ emacs-mode/*.el +source-repository head+ type: darcs+ location: http://code.haskell.org/Agda/++source-repository this+ type: darcs+ location: http://code.haskell.org/Agda/+ tag: 2.2.2+ library hs-source-dirs: src/full build-depends: base >= 3 && < 4,@@ -43,7 +58,7 @@ old-time >= 1 && < 2, bytestring >= 0.9.0.1 && < 1, array >= 0.1 && < 1,- binary >= 0.4.4 && < 0.5,+ binary >= 0.4.4 && < 0.6, zlib >= 0.4.0.1 && < 1, filepath >= 1.1 && < 2, process >= 1.0.1.0 && < 2,@@ -227,3 +242,12 @@ if impl(ghc >= 6.10) ghc-options: -fwarn-warnings-deprecations -fwarn-deprecated-flags -fwarn-dodgy-foreign-imports++executable agda-mode+ hs-source-dirs: src/agda-mode+ main-is: Main.hs+ other-modules: Paths_Agda+ build-depends: base >= 3 && < 4,+ filepath >= 1.1 && < 2,+ process >= 1.0.1.0 && < 2,+ utf8-string >= 0.3 && < 0.4
README view
@@ -1,259 +1,275 @@-README-------+========================================================================+Agda 2+======================================================================== -We recommend that you install Agda 2 using a binary package. To-install Agda 2 from source, proceed as follows:+Table of contents: -(An appendix below lists a partial installation script for Ubuntu-Linux.)+* Installing Agda+* Configuring the Emacs mode+* Prerequisites+* Installing a suitable version of Emacs under Windows+* Installation script for (at least) Ubuntu -0) Install prerequisites (recent versions of GHC, Alex, Happy and- cabal-install, and perhaps also darcs, Emacs and haskell-mode).+------------------------------------------------------------------------+Installing Agda+------------------------------------------------------------------------ - GHC: http://www.haskell.org/ghc/- Alex: http://www.haskell.org/alex/- Happy: http://www.haskell.org/happy/- cabal-install: http://www.haskell.org/cabal/- darcs: http://darcs.net/- GNU Emacs: http://www.gnu.org/software/emacs/- haskell-mode: http://haskell.org/haskell-mode/ (version 2.1 or later)+There are several ways to install Agda. - Note: If you are downloading a source tar-ball, then you do not- need Alex, Happy or darcs.+* Using a binary package, prepared for your platform. - For non-Windows users:- The development files for the C library zlib have to be installed- (see http://zlib.net). Your package manager may be able to- install these files for you. For instance, on Debian or Ubuntu- it should suffice to run- apt-get install zlib1g-dev- as root to get the correct files installed.+ Recommended if such a package exists. See the Agda Wiki. -1) Download Agda 2, perhaps as follows:+* Using stable packages available from Hackage. - darcs get --partial http://code.haskell.org/Agda- cd Agda+ Install the prerequisites mentioned below, then run the following+ commands: -2) If your system is Unix-like you can now hopefully install the- Agda 2 library, batch-mode tool and Emacs mode by running+ cabal install Agda-executable+ agda-mode setup - make install PREFIX=<installation location>+ The second command tries to set up Emacs for use with Agda. As an+ alternative you can copy the following text to your .emacs file: - (the PREFIX=<...> part can be omitted if the default location is OK- for you).+ (load-file (let ((coding-system-for-read 'utf-8))+ (shell-command-to-string "agda-mode locate"))) - If your system is not sufficiently Unix-like, or you want to have- more control, continue reading below.+* Using the source tar balls available from the Agda Wiki, or the+ development version of the code available from our darcs repository. -3) Build and install the Agda 2 library. If you want to install it in- the default location (you may need root privileges for this), use- the following command in the root of the Agda source tree:+ 1) Install the prerequisites mentioned below. - cabal install+ 2a) If your system is Unix-like you can now hopefully install the+ Agda 2 library, batch-mode tool and Emacs mode by running - You can select another location for the installation of the library- by using the following command:+ make install PREFIX=<installation location> - cabal install --prefix=<the install path>+ (the PREFIX=<...> part can be omitted if the default location is+ OK for you). - You can also give other options to the installer, see the built-in- documentation of cabal-install:+ If your system is not sufficiently Unix-like, or you want to have+ more control, follow 2b instead. - cabal install --help+ 2b) Run the following commands in the top-level directory of the+ Agda source tree: -4) If you want to use the Emacs mode (recommended), build and install- it (see below).+ cabal install+ agda-mode setup+ cd src/main+ cabal clean # To ensure recompilation when upgrading.+ cabal install -5) If you want to use the batch-mode Agda tool (not necessary), go to- the src/main directory and run the following commands:+ The second command tries to set up Emacs for use with Agda. As+ an alternative you can copy the following text to your .emacs+ file: - cabal clean # To ensure recompilation when upgrading.- cabal install+ (load-file (let ((coding-system-for-read 'utf-8))+ (shell-command-to-string "agda-mode locate"))) - (You can give options to cabal-install just as under step 2.)+ If you want to have more control over where files are installed+ then you can give various flags to cabal install, see+ cabal install --help. - When upgrading Agda, note that the batch-mode tool also needs to be- rebuilt.+ A section below lists an installation script which should work under+ the Ubuntu distribution of GNU/Linux, assuming that your+ configuration is reasonably standard. -------------------------------------------------------------------------To use the Agda 2 Emacs mode:+Configuring the Emacs mode+------------------------------------------------------------------------ --1. Install Emacs.+If you want to you can customise the Emacs mode. Just start Emacs and+type the following: - (For non-Windows - jump down to **END OF "Under Windows ...")- **Under Windows you may want to follow the following procedure:+ M-x load-library RET agda2-mode RET+ M-x customize-group RET agda2 RET - 1. Install NTEmacs 22.+This is useful if you want to change the Agda search path, in which+case you should change the agda2-include-dirs variable. - Download from- http://ntemacs.sourceforge.net/- the self-extracting executable- ntemacs22-bin-20070819.exe+If you want some specific settings for the Emacs mode you can add them+to agda2-mode-hook. For instance, if you do not want to use the Agda+input method (for writing various symbols like ∀≥ℕ→π⟦⟧) you can add+the following to your .emacs: - When executed, it asks where to extract itself. This can be- anywhere you like, but here we write the top directory for ntemacs as- c:/pkg/ntemacs- in the following.+(add-hook 'agda2-mode-hook+ '(lambda ()+ ; If you do not want to use any input method:+ (inactivate-input-method)+ ; If you want to use the X input method:+ (set-input-method "X")+ )) - What follows is tested only on this version. Other versions may- work but you have to figure out yourself how to use Unicode fonts- on your version.+Note that, on some systems, the Emacs mode changes the default font of+the current frame in order to enable many Unicode symbols to be+displayed. This only works if the right fonts are available, though.+If you want to turn off this feature, then you should customise the+agda2-fontset-name variable. - 2. Install ucs-fonts and mule-fonts for emacs.+------------------------------------------------------------------------+Prerequisites+------------------------------------------------------------------------ - Download from- http://www.cl.cam.ac.uk/~mgk25/ucs-fonts.html- the tar file- http://www.cl.cam.ac.uk/~mgk25/download/ucs-fonts.tar.gz- Let us write the top directory of extracted files as- c:/pkg/ucs-fonts- Next we create some derived fonts.- cd c:/pkg/ucs-fonts/submission- make all-bdfs- This gives an error message about missing fonts, but ignore it.+For stable packages you need recent versions of the following+programs/libraries: - Download from- http://www.meadowy.org/- the tar file- http://www.meadowy.org/meadow/dists/3.00/packages/mule-fonts-1.0-4-pkg.tar.bz2- The untarred top directory is named "packages", but we are only- interested in the subdirectory "packages/fonts". Let us assume- we moved this subdirectory to- c:/pkg/mule-fonts+ GHC: http://www.haskell.org/ghc/+ cabal-install: http://www.haskell.org/cabal/+ GNU Emacs: http://www.gnu.org/software/emacs/+ haskell-mode: http://haskell.org/haskell-mode/ (version 2.1 or later) - Add the following to your .emacs+You should also make sure that programs installed by cabal-install are+on your shell's search path. - ;;;;;;;;; start of quoted elisp code+For instructions on installing a suitable version of Emacs under+Windows, see below. - (setq bdf-directory-list- '(- "c:/pkg/ucs-fonts/submission"- "c:/pkg/mule-fonts/intlfonts"- "c:/pkg/mule-fonts/efonts"- "c:/pkg/mule-fonts/bitmap"- "c:/pkg/mule-fonts/CDAC"- "c:/pkg/mule-fonts/AkrutiFreeFonts"- ))+Non-Windows users need to ensure that the development files for the C+library zlib are installed (see http://zlib.net). Your package manager+may be able to install these files for you. For instance, on Debian or+Ubuntu it should suffice to run - (setq w32-bdf-filename-alist- (w32-find-bdf-fonts bdf-directory-list))+ apt-get install zlib1g-dev - (create-fontset-from-fontset-spec- "-*-fixed-Medium-r-Normal-*-15-*-*-*-c-*-fontset-bdf,- ascii:-Misc-Fixed-Medium-R-Normal--15-140-75-75-C-90-ISO8859-1,- latin-iso8859-2:-*-Fixed-*-r-*-*-15-*-*-*-c-*-iso8859-2,- latin-iso8859-3:-*-Fixed-*-r-*-*-15-*-*-*-c-*-iso8859-3,- latin-iso8859-4:-*-Fixed-*-r-*-*-15-*-*-*-c-*-iso8859-4,- cyrillic-iso8859-5:-*-Fixed-*-r-*-*-15-*-*-*-c-*-iso8859-5,- greek-iso8859-7:-*-Fixed-*-r-*-*-15-*-*-*-c-*-iso8859-7,- latin-iso8859-9:-*-Fixed-*-r-*-*-15-*-*-*-c-*-iso8859-9,- mule-unicode-0100-24ff:-Misc-Fixed-Medium-R-Normal--15-140-75-75-C-90-ISO10646-1,- mule-unicode-2500-33ff:-Misc-Fixed-Medium-R-Normal--15-140-75-75-C-90-ISO10646-1,- mule-unicode-e000-ffff:-Misc-Fixed-Medium-R-Normal--15-140-75-75-C-90-ISO10646-1,- japanese-jisx0208:-JIS-Fixed-Medium-R-Normal--16-150-75-75-C-160-JISX0208.1983-0,- japanese-jisx0208-1978:-Misc-Fixed-Medium-R-Normal--16-150-75-75-C-160-JISC6226.1978-0,- japanese-jisx0212:-Misc-Fixed-Medium-R-Normal--16-150-75-75-C-160-JISX0212.1990-0,- latin-jisx0201:-*-*-medium-r-normal-*-16-*-*-*-c-*-jisx0201*-*,- katakana-jisx0201:-Sony-Fixed-Medium-R-Normal--16-120-100-100-C-80-JISX0201.1976-0,- thai-tis620:-Misc-Fixed-Medium-R-Normal--24-240-72-72-C-120-TIS620.2529-1,- lao:-Misc-Fixed-Medium-R-Normal--24-240-72-72-C-120-MuleLao-1,- tibetan:-TibMdXA-fixed-medium-r-normal--16-160-72-72-m-160-MuleTibetan-0,- tibetan-1-column:-TibMdXA-fixed-medium-r-normal--16-160-72-72-m-80-MuleTibetan-1,- korean-ksc5601:-Daewoo-Mincho-Medium-R-Normal--16-120-100-100-C-160-KSC5601.1987-0,- chinese-gb2312:-ISAS-Fangsong ti-Medium-R-Normal--16-160-72-72-c-160-GB2312.1980-0,- chinese-cns11643-1:-HKU-Fixed-Medium-R-Normal--16-160-72-72-C-160-CNS11643.1992.1-0,- chinese-big5-1:-ETen-Fixed-Medium-R-Normal--16-150-75-75-C-160-Big5.ETen-0,- chinese-big5-2:-ETen-Fixed-Medium-R-Normal--16-150-75-75-C-160-Big5.ETen-0- " t)+as root to get the correct files installed. - (setq font-encoding-alist- (append '(- ("JISX0208" (japanese-jisx0208 . 0))- ("JISX0212" (japanese-jisx0212 . 0))- ("CNS11643.1992.1-0" (chinese-cns11643-1 . 0))- ("GB2312" (chinese-gb2312 . 0))- ("KSC5601" (korean-ksc5601 . 0))- ("VISCII" (vietnamese-viscii-lower . 0))- ("MuleArabic-0" (arabic-digit . 0))- ("MuleArabic-1" (arabic-1-column . 0))- ("MuleArabic-2" (arabic-2-column . 0))- ("muleindian-1" (indian-1-column . 0))- ("muleindian-2" (indian-2-column . 0))- ("MuleTibetan-0" (tibetan . 0))- ("MuleTibetan-1" (tibetan-1-column . 0))- ) font-encoding-alist))+For the development version of Agda you also need recent versions of+the following programs: - ;;;;;;; end of quoted elisp code+ Alex: http://www.haskell.org/alex/+ Happy: http://www.haskell.org/happy/ - To test the fonts, try+------------------------------------------------------------------------+Installing a suitable version of Emacs under Windows+------------------------------------------------------------------------ - M-x eval-expression RET- (set-default-font "fontset-bdf") RET- M-x view-hello-file+Note that Agda code often uses mathematical and other symbols+available from the Unicode character set. In order to be able to+display these characters you may want to follow the procedure below+when installing Emacs under Windows. - You should see all the characters without white-boxes.- **END OF "Under Windows ..."+1. Install NTEmacs 22. -1. Install Agda 2. (See above.)+ Download from+ http://ntemacs.sourceforge.net/+ the self-extracting executable+ ntemacs22-bin-20070819.exe -2. Copy the .el files in src/emacs-mode to some directory- <agda-mode-dir>. Example installation:+ When executed, it asks where to extract itself. This can be+ anywhere you like, but here we write the top directory for ntemacs as+ c:/pkg/ntemacs+ in the following. - mkdir <agda-mode-dir>- cp src/emacs-mode/*.el <agda-mode-dir>+ What follows is tested only on this version. Other versions may+ work but you have to figure out yourself how to use Unicode fonts+ on your version. -3. Add the following to your .emacs:+2. Install ucs-fonts and mule-fonts for emacs. - (add-to-list 'load-path "<agda-mode-dir>")- (require 'agda2)+ Download from+ http://www.cl.cam.ac.uk/~mgk25/ucs-fonts.html+ the tar file+ http://www.cl.cam.ac.uk/~mgk25/download/ucs-fonts.tar.gz+ Let us write the top directory of extracted files as+ c:/pkg/ucs-fonts+ Next we create some derived fonts.+ cd c:/pkg/ucs-fonts/submission+ make all-bdfs+ This gives an error message about missing fonts, but ignore it. - If you have already set up the suffix .agda for use with some other- mode you may need to remove or alter that setting. You are- encouraged to use the suffix .alfa for Agda 1 files.+ Download from+ http://www.meadowy.org/+ the tar file+ http://www.meadowy.org/meadow/dists/3.00/packages/mule-fonts-1.0-4-pkg.tar.bz2+ The untarred top directory is named "packages", but we are only+ interested in the subdirectory "packages/fonts". Let us assume+ we moved this subdirectory to+ c:/pkg/mule-fonts - Now, if you open a file named XXX.agda the buffer will use- agda2-mode. It may take 5 or 10 seconds before you see anything in- the buffer, but that is normal.+ Add the following to your .emacs -4. If you want to you can customise some settings. Just start Emacs- and type the following:+;;;;;;;;; start of quoted elisp code - M-x load-library RET agda2-mode RET- M-x customize-group RET agda2 RET+(setq bdf-directory-list+ '(+ "c:/pkg/ucs-fonts/submission"+ "c:/pkg/mule-fonts/intlfonts"+ "c:/pkg/mule-fonts/efonts"+ "c:/pkg/mule-fonts/bitmap"+ "c:/pkg/mule-fonts/CDAC"+ "c:/pkg/mule-fonts/AkrutiFreeFonts"+ )) - This is useful if you want to change the Agda search path, in which- case you should change the agda2-include-dirs variable.+(setq w32-bdf-filename-alist+ (w32-find-bdf-fonts bdf-directory-list)) -5. If you want some specific settings for the Emacs mode you can add- them to agda2-mode-hook. For instance, if you do not want to use- the Agda input method (for writing various symbols like ∀≥ℕ→π⟦⟧)- you can add the following to your .emacs:+(create-fontset-from-fontset-spec+ "-*-fixed-Medium-r-Normal-*-15-*-*-*-c-*-fontset-bdf,+ ascii:-Misc-Fixed-Medium-R-Normal--15-140-75-75-C-90-ISO8859-1,+ latin-iso8859-2:-*-Fixed-*-r-*-*-15-*-*-*-c-*-iso8859-2,+ latin-iso8859-3:-*-Fixed-*-r-*-*-15-*-*-*-c-*-iso8859-3,+ latin-iso8859-4:-*-Fixed-*-r-*-*-15-*-*-*-c-*-iso8859-4,+ cyrillic-iso8859-5:-*-Fixed-*-r-*-*-15-*-*-*-c-*-iso8859-5,+ greek-iso8859-7:-*-Fixed-*-r-*-*-15-*-*-*-c-*-iso8859-7,+ latin-iso8859-9:-*-Fixed-*-r-*-*-15-*-*-*-c-*-iso8859-9,+ mule-unicode-0100-24ff:-Misc-Fixed-Medium-R-Normal--15-140-75-75-C-90-ISO10646-1,+ mule-unicode-2500-33ff:-Misc-Fixed-Medium-R-Normal--15-140-75-75-C-90-ISO10646-1,+ mule-unicode-e000-ffff:-Misc-Fixed-Medium-R-Normal--15-140-75-75-C-90-ISO10646-1,+ japanese-jisx0208:-JIS-Fixed-Medium-R-Normal--16-150-75-75-C-160-JISX0208.1983-0,+ japanese-jisx0208-1978:-Misc-Fixed-Medium-R-Normal--16-150-75-75-C-160-JISC6226.1978-0,+ japanese-jisx0212:-Misc-Fixed-Medium-R-Normal--16-150-75-75-C-160-JISX0212.1990-0,+ latin-jisx0201:-*-*-medium-r-normal-*-16-*-*-*-c-*-jisx0201*-*,+ katakana-jisx0201:-Sony-Fixed-Medium-R-Normal--16-120-100-100-C-80-JISX0201.1976-0,+ thai-tis620:-Misc-Fixed-Medium-R-Normal--24-240-72-72-C-120-TIS620.2529-1,+ lao:-Misc-Fixed-Medium-R-Normal--24-240-72-72-C-120-MuleLao-1,+ tibetan:-TibMdXA-fixed-medium-r-normal--16-160-72-72-m-160-MuleTibetan-0,+ tibetan-1-column:-TibMdXA-fixed-medium-r-normal--16-160-72-72-m-80-MuleTibetan-1,+ korean-ksc5601:-Daewoo-Mincho-Medium-R-Normal--16-120-100-100-C-160-KSC5601.1987-0,+ chinese-gb2312:-ISAS-Fangsong ti-Medium-R-Normal--16-160-72-72-c-160-GB2312.1980-0,+ chinese-cns11643-1:-HKU-Fixed-Medium-R-Normal--16-160-72-72-C-160-CNS11643.1992.1-0,+ chinese-big5-1:-ETen-Fixed-Medium-R-Normal--16-150-75-75-C-160-Big5.ETen-0,+ chinese-big5-2:-ETen-Fixed-Medium-R-Normal--16-150-75-75-C-160-Big5.ETen-0+ " t) - (add-hook 'agda2-mode-hook- '(lambda ()- ; If you do not want to use any input method:- (inactivate-input-method)- ; If you want to use the X input method:- (set-input-method "X")- ))+(setq font-encoding-alist+ (append '(+ ("JISX0208" (japanese-jisx0208 . 0))+ ("JISX0212" (japanese-jisx0212 . 0))+ ("CNS11643.1992.1-0" (chinese-cns11643-1 . 0))+ ("GB2312" (chinese-gb2312 . 0))+ ("KSC5601" (korean-ksc5601 . 0))+ ("VISCII" (vietnamese-viscii-lower . 0))+ ("MuleArabic-0" (arabic-digit . 0))+ ("MuleArabic-1" (arabic-1-column . 0))+ ("MuleArabic-2" (arabic-2-column . 0))+ ("muleindian-1" (indian-1-column . 0))+ ("muleindian-2" (indian-2-column . 0))+ ("MuleTibetan-0" (tibetan . 0))+ ("MuleTibetan-1" (tibetan-1-column . 0))+ ) font-encoding-alist)) - A side note: In order to display Unicode characters you need to use- a font which contains the glyphs in question. If such a font is not- enabled by default (empty boxes are displayed instead of proper- characters) you need to select another font. Do this by running- M-x customize-face RET agda2-fontset-spec RET- in Emacs (after you have started the Agda mode) and change the- setting to a suitable font.+;;;;;;; end of quoted elisp code --------------------------------------------------------------------Appendix: Partial installation script for (at least) Ubuntu Linux+ To test the fonts, try -sudo apt-get install ghc6 happy alex darcs emacs haskell-mode zlib1g-dev-wget http://www.haskell.org/cabal/release/cabal-install-0.6.0.tar.gz-tar xzf cabal-install-0.6.0.tar.gz-cd cabal-install-0.6.0-. bootstrap.sh-cd ..-darcs get --partial http://code.haskell.org/Agda-cd Agda-sudo make install+ M-x eval-expression RET+ (set-default-font "fontset-bdf") RET+ M-x view-hello-file++ You should see all the characters without white-boxes.++------------------------------------------------------------------------+Installation script for (at least) Ubuntu+------------------------------------------------------------------------++Installs the development version.++ sudo apt-get install ghc6 happy alex darcs emacs haskell-mode zlib1g-dev+ wget http://www.haskell.org/cabal/release/cabal-install-0.6.0.tar.gz+ tar xzf cabal-install-0.6.0.tar.gz+ cd cabal-install-0.6.0+ . bootstrap.sh+ cd ..+ darcs get --partial http://code.haskell.org/Agda+ cd Agda+ sudo make install
+ src/agda-mode/Main.hs view
@@ -0,0 +1,190 @@+-- | A program which either tries to add setup code for Agda's Emacs+-- mode to the users .emacs file, or provides information to Emacs+-- about where the Emacs mode is installed.++module Main (main) where++import Control.Exception+import Control.Monad+import Data.Char+import Data.List+import Data.Version+import Numeric+import System.Directory+import System.Environment+import System.Exit+import System.FilePath+import System.IO+import qualified System.IO.UTF8 as UTF8+import System.Process++import Paths_Agda (getDataDir, version)++-- | The program.++main :: IO ()+main = do+ prog <- getProgName+ args <- getArgs+ case args of+ [arg] | arg == locateFlag -> printEmacsModeFile+ | arg == setupFlag -> do+ dotEmacs <- findDotEmacs+ setupDotEmacs (Files { thisProgram = prog+ , dotEmacs = dotEmacs+ })+ _ -> do inform usage+ exitFailure++-- Command line options.++setupFlag = "setup"+locateFlag = "locate"++-- | Usage information.++usage :: String+usage = unlines+ [ "This program, which is part of Agda version " ++ ver ++ ", can be run"+ , "in two modes, depending on which option it is invoked with:"+ , ""+ , setupFlag+ , ""+ , " The program tries to add setup code for Agda's Emacs mode to the"+ , " current user's .emacs file. It is assumed that the .emacs file"+ , " uses ASCII or some other character encoding which ASCII is"+ , " compatible with (like Latin-1 or UTF-8)."+ , ""+ , locateFlag+ , ""+ , " The path to the Emacs mode's main file is printed on standard"+ , " output (using the UTF-8 character encoding and no trailing"+ , " newline)."+ ]++-- | The current version of Agda.++ver :: String+ver = intercalate "." $ map show $+ versionBranch version++------------------------------------------------------------------------+-- Locating the Agda mode++-- | Prints out the path to the Agda mode's main file (using UTF-8 and+-- without any trailing newline).++printEmacsModeFile :: IO ()+printEmacsModeFile = do+ dataDir <- getDataDir+ UTF8.putStr $ dataDir </> "emacs-mode" </> "agda2.el"++------------------------------------------------------------------------+-- Setting up the .emacs file++data Files = Files { dotEmacs :: FilePath+ -- ^ The .emacs file.+ , thisProgram :: FilePath+ -- ^ The name of the current program.+ }++-- | Tries to set up the Agda mode in the given .emacs file.++setupDotEmacs :: Files -> IO ()+setupDotEmacs files = do+ informLn $ "The .emacs file used: " ++ dotEmacs files++ already <- alreadyInstalled files+ if already then+ informLn "It seems as if setup has already been performed."+ else do++ appendFile (dotEmacs files) (setupString files)+ inform $ unlines $+ [ "Setup done. Try to (re)start Emacs and open an Agda file."+ , "The following text was appended to the .emacs file:"+ ] ++ lines (setupString files)++-- | Tries to find the user's .emacs file by querying Emacs.++findDotEmacs :: IO FilePath+findDotEmacs = askEmacs "(insert (expand-file-name user-init-file))"++-- | Has the Agda mode already been set up?++alreadyInstalled :: Files -> IO Bool+alreadyInstalled files = do+ exists <- doesFileExist (dotEmacs files)+ if not exists then return False else+ withFile (dotEmacs files) ReadMode $ \h ->+ evaluate . (identifier files `isInfixOf`) =<< hGetContents h+ -- Uses evaluate to ensure that the file is not closed+ -- prematurely.++-- | If this string occurs in the .emacs file, then it is assumed that+-- setup has already been performed.++identifier :: Files -> String+identifier files =+ takeFileName (thisProgram files) ++ " " ++ locateFlag++-- | The string appended to the end of the .emacs file. It is assumed+-- that the .emacs file uses ASCII or some other character encoding+-- which ASCII is compatible with (like Latin-1 or UTF-8).++setupString :: Files -> String+setupString files = unlines+ [ ""+ , "(load-file (let ((coding-system-for-read 'utf-8))" + , " (shell-command-to-string \""+ ++ identifier files ++ "\")))"+ ]++------------------------------------------------------------------------+-- Querying Emacs++-- | Evaluates the given Elisp command using Emacs. The output of the+-- command (whatever was written into the current buffer) is returned.+--+-- Note: The input is not checked. The input is assumed to come from a+-- trusted source.++askEmacs :: String -> IO String+askEmacs query = do+ tempDir <- getTemporaryDirectory+ bracket (openTempFile tempDir "askEmacs")+ (removeFile . fst) $ \(file, h) -> do+ hClose h+ exit <- rawSystem "emacs"+ [ "--eval"+ , "(with-temp-file " ++ escape file ++ " "+ ++ query ++ ")"+ , "--kill"+ ]+ unless (exit == ExitSuccess) $ do+ informLn "Unable to query Emacs."+ exitFailure+ withFile file ReadMode $ \h -> do+ result <- hGetContents h+ evaluate (length result)+ -- Uses evaluate to ensure that the file is not closed+ -- prematurely.+ return result++-- | Escapes the string so that Emacs can parse it as an Elisp string.++escape :: FilePath -> FilePath+escape s = "\"" ++ concatMap esc s ++ "\""+ where+ esc c | c `elem` ['\\', '"'] = '\\' : [c]+ | isAscii c && isPrint c = [c]+ | otherwise = "\\x" ++ showHex (fromEnum c) "\\ "++------------------------------------------------------------------------+-- Helper functions++-- These functions inform the user about something by printing on+-- stderr.++inform = hPutStr stderr+informLn = hPutStrLn stderr
+ src/data/emacs-mode/agda-input.el view
@@ -0,0 +1,817 @@+;;; agda-input.el --- The Agda input method++;;; Commentary:++;; A highly customisable input method which can inherit from other+;; Quail input methods. By default the input method is geared towards+;; the input of mathematical and other symbols in Agda programs.+;;+;; Use M-x customize-group agda-input to customise this input method.+;; Note that the functions defined under "Functions used to tweak+;; translation pairs" below can be used to tweak both the key+;; translations inherited from other input methods as well as the+;; ones added specifically for this one.+;;+;; Use agda-input-show-translations to see all the characters which+;; can be typed using this input method (except for those+;; corresponding to ASCII characters).++;;; Code:++(require 'quail)+(require 'cl)++;; Quail is quite stateful, so be careful when editing this code. Note+;; that with-temp-buffer is used below whenever buffer-local state is+;; modified.++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+;; Utility functions++(defun agda-input-concat-map (f xs)+ "Concat (map F XS)."+ (apply 'append (mapcar f xs)))++(defun agda-input-to-string-list (s)+ "Convert a string S to a list of one-character strings, after+removing all space and newline characters."+ (agda-input-concat-map+ (lambda (c) (if (member c (string-to-list " \n"))+ nil+ (list (string c))))+ (string-to-list s)))++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+;; Functions used to tweak translation pairs++;; lexical-let is used since Elisp lacks lexical scoping.++(defun agda-input-compose (f g)+ "\x -> concatMap F (G x)"+ (lexical-let ((f1 f) (g1 g))+ (lambda (x) (agda-input-concat-map f1 (funcall g1 x)))))++(defun agda-input-or (f g)+ "\x -> F x ++ G x"+ (lexical-let ((f1 f) (g1 g))+ (lambda (x) (append (funcall f1 x) (funcall g1 x)))))++(defun agda-input-nonempty ()+ "Only keep pairs with a non-empty first component."+ (lambda (x) (if (> (length (car x)) 0) (list x))))++(defun agda-input-prepend (prefix)+ "Prepend PREFIX to all key sequences."+ (lexical-let ((prefix1 prefix))+ (lambda (x) `((,(concat prefix1 (car x)) . ,(cdr x))))))++(defun agda-input-prefix (prefix)+ "Only keep pairs whose key sequence starts with PREFIX."+ (lexical-let ((prefix1 prefix))+ (lambda (x)+ (if (equal (substring (car x) 0 (length prefix1)) prefix1)+ (list x)))))++(defun agda-input-suffix (suffix)+ "Only keep pairs whose key sequence ends with SUFFIX."+ (lexical-let ((suffix1 suffix))+ (lambda (x)+ (if (equal (substring (car x)+ (- (length (car x)) (length suffix1)))+ suffix1)+ (list x)))))++(defun agda-input-drop (ss)+ "Drop pairs matching one of the given key sequences.+SS should be a list of strings."+ (lexical-let ((ss1 ss))+ (lambda (x) (unless (member (car x) ss1) (list x)))))++(defun agda-input-drop-beginning (n)+ "Drop N characters from the beginning of each key sequence."+ (lexical-let ((n1 n))+ (lambda (x) `((,(substring (car x) n1) . ,(cdr x))))))++(defun agda-input-drop-end (n)+ "Drop N characters from the end of each key sequence."+ (lexical-let ((n1 n))+ (lambda (x)+ `((,(substring (car x) 0 (- (length (car x)) n1)) .+ ,(cdr x))))))++(defun agda-input-drop-prefix (prefix)+ "Only keep pairs whose key sequence starts with PREFIX.+This prefix is dropped."+ (agda-input-compose+ (agda-input-drop-beginning (length prefix))+ (agda-input-prefix prefix)))++(defun agda-input-drop-suffix (suffix)+ "Only keep pairs whose key sequence ends with SUFFIX.+This suffix is dropped."+ (lexical-let ((suffix1 suffix))+ (agda-input-compose+ (agda-input-drop-end (length suffix1))+ (agda-input-suffix suffix1))))++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+;; Customization++;; The :set keyword is set to 'agda-input-incorporate-changed-setting+;; so that the input method gets updated immediately when users+;; customize it. However, the setup functions cannot be run before all+;; variables have been defined. Hence the :initialize keyword is set to+;; 'custom-initialize-default to ensure that the setup is not performed+;; until agda-input-setup is called at the end of this file.++(defgroup agda-input nil+ "The Agda 2 input method.+After tweaking these settings you may want to inspect the resulting+translations using `agda-input-show-translations'."+ :group 'agda2+ :group 'leim)++(defcustom agda-input-tweak-all+ '(agda-input-compose+ (agda-input-prepend "\\")+ (agda-input-nonempty))+ "An expression yielding a function which can be used to tweak+all translations before they are included in the input method.+The resulting function (if non-nil) is applied to every+\(KEY-SEQUENCE . TRANSLATION) pair and should return a list of such+pairs. (Note that the translations can be anything accepted by+`quail-defrule'.)++If you change this setting manually (without using the+customization buffer) you need to call `agda-input-setup' in+order for the change to take effect."+ :group 'agda-input+ :set 'agda-input-incorporate-changed-setting+ :initialize 'custom-initialize-default+ :type 'sexp)++(defcustom agda-input-inherit+ `(("TeX" . (agda-input-compose+ (agda-input-drop '("geq" "leq" "bullet" "qed"))+ (agda-input-or+ (agda-input-drop-prefix "\\")+ (agda-input-or+ (agda-input-compose+ (agda-input-drop '("^o"))+ (agda-input-prefix "^"))+ (agda-input-prefix "_")))))+ )+ "A list of Quail input methods whose translations should be+inherited by the Agda input method (with the exception of+translations corresponding to ASCII characters).++The list consists of pairs (qp . tweak), where qp is the name of+a Quail package, and tweak is an expression of the same kind as+`agda-input-tweak-all' which is used to tweak the translation+pairs of the input method.++If you change this setting manually (without using the+customization buffer) you need to call `agda-input-setup' in+order for the change to take effect."+ :group 'agda-input+ :set 'agda-input-incorporate-changed-setting+ :initialize 'custom-initialize-default+ :type '(repeat (cons (string :tag "Quail package")+ (sexp :tag "Tweaking function"))))++(defcustom agda-input-translations+ (let ((max-lisp-eval-depth 2800)) `(++ ;; Equality and similar symbols.++ ("eq" . ,(agda-input-to-string-list "=∼∽≈≋∻∾∿≀≃⋍≂≅ ≌≊≡≣≐≑≒≓≔≕≖≗≘≙≚≛≜≝≞≟≍≎≏≬⋕"))+ ("eqn" . ,(agda-input-to-string-list "≠≁ ≉ ≄ ≇≆ ≢ ≭ "))++ ("=n" . ("≠"))+ ("~" . ("∼")) ("~n" . ("≁"))+ ("~~" . ("≈")) ("~~n" . ("≉"))+ ("~~~" . ("≋"))+ (":~" . ("∻"))+ ("~-" . ("≃")) ("~-n" . ("≄"))+ ("-~" . ("≂"))+ ("~=" . ("≅")) ("~=n" . ("≇"))+ ("~~-" . ("≊"))+ ("==" . ("≡")) ("==n" . ("≢"))+ ("===" . ("≣"))+ (".=" . ("≐")) (".=." . ("≑"))+ (":=" . ("≔")) ("=:" . ("≕"))+ ("=o" . ("≗"))+ ("(=" . ("≘"))+ ("and=" . ("≙")) ("or=" . ("≚"))+ ("*=" . ("≛"))+ ("t=" . ("≜"))+ ("def=" . ("≝"))+ ("m=" . ("≞"))+ ("?=" . ("≟"))++ ;; Inequality and similar symbols.++ ("leq" . ,(agda-input-to-string-list "<≪⋘≤≦≲ ≶≺≼≾⊂⊆ ⋐⊏⊑ ⊰⊲⊴⋖⋚⋜⋞"))+ ("leqn" . ,(agda-input-to-string-list "≮ ≰≨≴⋦≸⊀ ⋨⊄⊈⊊ ⋢⋤ ⋪⋬ ⋠"))+ ("geq" . ,(agda-input-to-string-list ">≫⋙≥≧≳ ≷≻≽≿⊃⊇ ⋑⊐⊒ ⊱⊳⊵⋗⋛⋝⋟"))+ ("geqn" . ,(agda-input-to-string-list "≯ ≱≩≵⋧≹⊁ ⋩⊅⊉⊋ ⋣⋥ ⋫⋭ ⋡"))++ ("<=" . ("≤")) (">=" . ("≥"))+ ("<=n" . ("≰")) (">=n" . ("≱"))+ ("len" . ("≰")) ("gen" . ("≱"))+ ("<n" . ("≮")) (">n" . ("≯"))+ ("<~" . ("≲")) (">~" . ("≳"))+ ("<~n" . ("⋦")) (">~n" . ("⋧"))+ ("<~nn" . ("≴")) (">~nn" . ("≵"))++ ("sub" . ("⊂")) ("sup" . ("⊃"))+ ("subn" . ("⊄")) ("supn" . ("⊅"))+ ("sub=" . ("⊆")) ("sup=" . ("⊇"))+ ("sub=n" . ("⊈")) ("sup=n" . ("⊉"))++ ("squb" . ("⊏")) ("squp" . ("⊐"))+ ("squb=" . ("⊑")) ("squp=" . ("⊒"))+ ("squb=n" . ("⋢")) ("squp=n" . ("⋣"))++ ;; Set membership etc.++ ("member" . ,(agda-input-to-string-list "∈∉∊∋∌∍⋲⋳⋴⋵⋶⋷⋸⋹⋺⋻⋼⋽⋾⋿"))++ ("inn" . ("∉"))+ ("nin" . ("∌"))++ ;; Intersections, unions etc.++ ("intersection" . ,(agda-input-to-string-list "∩⋂∧⋀⋏⨇⊓⨅⋒∏ ⊼ ⨉"))+ ("union" . ,(agda-input-to-string-list "∪⋃∨⋁⋎⨈⊔⨆⋓∐⨿⊽⊻⊍⨃⊎⨄⊌∑⅀"))++ ("and" . ("∧")) ("or" . ("∨"))+ ("And" . ("⋀")) ("Or" . ("⋁"))+ ("i" . ("∩")) ("un" . ("∪")) ("u+" . ("⊎")) ("u." . ("⊍"))+ ("I" . ("⋂")) ("Un" . ("⋃")) ("U+" . ("⨄")) ("U." . ("⨃"))+ ("glb" . ("⊓")) ("lub" . ("⊔"))+ ("Glb" . ("⨅")) ("Lub" . ("⨆"))++ ;; Entailment etc.++ ("entails" . ,(agda-input-to-string-list "⊢⊣⊤⊥⊦⊧⊨⊩⊪⊫⊬⊭⊮⊯"))++ ("|-" . ("⊢")) ("|-n" . ("⊬"))+ ("-|" . ("⊣"))+ ("|=" . ("⊨")) ("|=n" . ("⊭"))++ ;; Divisibility, parallelity.++ ("|" . ("∣")) ("|n" . ("∤"))+ ("||" . ("∥")) ("||n" . ("∦"))++ ;; Some symbols from logic and set theory.++ ("all" . ("∀"))+ ("ex" . ("∃"))+ ("exn" . ("∄"))+ ("0" . ("∅"))+ ("C" . ("∁"))++ ;; Corners, ceilings and floors.++ ("c" . ,(agda-input-to-string-list "⌜⌝⌞⌟⌈⌉⌊⌋"))+ ("cu" . ,(agda-input-to-string-list "⌜⌝ ⌈⌉ "))+ ("cl" . ,(agda-input-to-string-list " ⌞⌟ ⌊⌋"))++ ("cul" . ("⌜")) ("cuL" . ("⌈"))+ ("cur" . ("⌝")) ("cuR" . ("⌉"))+ ("cll" . ("⌞")) ("clL" . ("⌊"))+ ("clr" . ("⌟")) ("clR" . ("⌋"))++ ;; Various operators/symbols.++ ,@(if (>= emacs-major-version 23)+ '(("pm" . ("±"))+ ("cdot" . ("·"))+ ("times" . ("×"))+ ("div" . ("÷"))+ ("neg" . ("¬"))))++ ("qed" . ("∎"))+ ("x" . ("×"))+ ("o" . ("∘"))+ ("comp" . ("∘"))+ ("." . ("∙"))+ ("*" . ("⋆"))+ (".+" . ("∔"))+ (".-" . ("∸"))+ (":" . ("∶"))+ ("::" . ("∷"))+ ("::-" . ("∺"))+ ("-:" . ("∹"))+ ("+ " . ("⊹"))+ ("surd3" . ("∛"))+ ("surd4" . ("∜"))+ ("increment" . ("∆"))+ ("inf" . ("∞"))++ ;; Circled operators.++ ("o+" . ("⊕"))+ ("o--" . ("⊖"))+ ("ox" . ("⊗"))+ ("o/" . ("⊘"))+ ("o." . ("⊙"))+ ("oo" . ("⊚"))+ ("o*" . ("⊛"))+ ("o=" . ("⊜"))+ ("o-" . ("⊝"))++ ("O+" . ("⨁"))+ ("Ox" . ("⨂"))+ ("O." . ("⨀"))+ ("O*" . ("⍟"))++ ;; Boxed operators.++ ("b+" . ("⊞"))+ ("b-" . ("⊟"))+ ("bx" . ("⊠"))+ ("b." . ("⊡"))++ ;; Various symbols.++ ("integral" . ,(agda-input-to-string-list "∫∬∭∮∯∰∱∲∳"))+ ("angle" . ,(agda-input-to-string-list "∟∡∢⊾⊿"))+ ("join" . ,(agda-input-to-string-list "⋈⋉⋊⋋⋌⨝⟕⟖⟗"))++ ;; Arrows.++ ("l" . ,(agda-input-to-string-list "←⇐⇚⇇⇆↤⇦↞↼↽⇠⇺↜⇽⟵⟸↚⇍⇷ ↹ ↢↩↫⇋⇜⇤⟻⟽⤆↶↺⟲ "))+ ("r" . ,(agda-input-to-string-list "→⇒⇛⇉⇄↦⇨↠⇀⇁⇢⇻↝⇾⟶⟹↛⇏⇸⇶ ↴ ↣↪↬⇌⇝⇥⟼⟾⤇↷↻⟳⇰⇴⟴⟿ ➵➸➙➔➛➜➝➞➟➠➡➢➣➤➧➨➩➪➫➬➭➮➯➱➲➳➺➻➼➽➾"))+ ("u" . ,(agda-input-to-string-list "↑⇑⟰⇈⇅↥⇧↟↿↾⇡⇞ ↰↱➦ ⇪⇫⇬⇭⇮⇯ "))+ ("d" . ,(agda-input-to-string-list "↓⇓⟱⇊⇵↧⇩↡⇃⇂⇣⇟ ↵↲↳➥ ↯ "))+ ("ud" . ,(agda-input-to-string-list "↕⇕ ↨⇳ "))+ ("lr" . ,(agda-input-to-string-list "↔⇔ ⇼↭⇿⟷⟺↮⇎⇹ "))+ ("ul" . ,(agda-input-to-string-list "↖⇖ ⇱↸ "))+ ("ur" . ,(agda-input-to-string-list "↗⇗ ➶➹➚ "))+ ("dr" . ,(agda-input-to-string-list "↘⇘ ⇲ ➴➷➘ "))+ ("dl" . ,(agda-input-to-string-list "↙⇙ "))++ ("l-" . ("←")) ("<-" . ("←")) ("l=" . ("⇐"))+ ("r-" . ("→")) ("->" . ("→")) ("r=" . ("⇒")) ("=>" . ("⇒"))+ ("u-" . ("↑")) ("u=" . ("⇑"))+ ("d-" . ("↓")) ("d=" . ("⇓"))+ ("ud-" . ("↕")) ("ud=" . ("⇕"))+ ("lr-" . ("↔")) ("<->" . ("↔")) ("lr=" . ("⇔")) ("<=>" . ("⇔"))+ ("ul-" . ("↖")) ("ul=" . ("⇖"))+ ("ur-" . ("↗")) ("ur=" . ("⇗"))+ ("dr-" . ("↘")) ("dr=" . ("⇘"))+ ("dl-" . ("↙")) ("dl=" . ("⇙"))++ ("l==" . ("⇚")) ("l-2" . ("⇇")) ("l-r-" . ("⇆"))+ ("r==" . ("⇛")) ("r-2" . ("⇉")) ("r-3" . ("⇶")) ("r-l-" . ("⇄"))+ ("u==" . ("⟰")) ("u-2" . ("⇈")) ("u-d-" . ("⇅"))+ ("d==" . ("⟱")) ("d-2" . ("⇊")) ("d-u-" . ("⇵"))++ ("l--" . ("⟵")) ("<--" . ("⟵")) ("l~" . ("↜" "⇜"))+ ("r--" . ("⟶")) ("-->" . ("⟶")) ("r~" . ("↝" "⇝" "⟿"))+ ("lr--" . ("⟷")) ("<-->" . ("⟷")) ("lr~" . ("↭"))++ ("l-n" . ("↚")) ("<-n" . ("↚")) ("l=n" . ("⇍"))+ ("r-n" . ("↛")) ("->n" . ("↛")) ("r=n" . ("⇏")) ("=>n" . ("⇏"))+ ("lr-n" . ("↮")) ("<->n" . ("↮")) ("lr=n" . ("⇎")) ("<=>n" . ("⇎"))++ ("l-|" . ("↤")) ("ll-" . ("↞"))+ ("r-|" . ("↦")) ("rr-" . ("↠"))+ ("u-|" . ("↥")) ("uu-" . ("↟"))+ ("d-|" . ("↧")) ("dd-" . ("↡"))+ ("ud-|" . ("↨"))++ ("dz" . ("↯"))++ ;; Ellipsis.++ ("..." . ,(agda-input-to-string-list "⋯⋮⋰⋱"))++ ;; Box-drawing characters.++ ("---" . ,(agda-input-to-string-list "─│┌┐└┘├┤┬┼┴╴╵╶╷╭╮╯╰╱╲╳"))+ ("--=" . ,(agda-input-to-string-list "═║╔╗╚╝╠╣╦╬╩ ╒╕╘╛╞╡╤╪╧ ╓╖╙╜╟╢╥╫╨"))+ ("--_" . ,(agda-input-to-string-list "━┃┏┓┗┛┣┫┳╋┻╸╹╺╻+ ┍┯┑┕┷┙┝┿┥┎┰┒┖┸┚┠╂┨┞╀┦┟╁┧┢╈┪┡╇┩+ ┮┭┶┵┾┽┲┱┺┹╊╉╆╅╄╃ ╿╽╼╾"))+ ("--." . ,(agda-input-to-string-list "╌╎┄┆┈┊+ ╍╏┅┇┉┋"))++ ;; Triangles.++ ;; Big/small, black/white.++ ("t" . ,(agda-input-to-string-list "◂◃◄◅▸▹►▻▴▵▾▿◢◿◣◺◤◸◥◹"))+ ("T" . ,(agda-input-to-string-list "◀◁▶▷▲△▼▽◬◭◮"))++ ("tb" . ,(agda-input-to-string-list "◂▸▴▾◄►◢◣◤◥"))+ ("tw" . ,(agda-input-to-string-list "◃▹▵▿◅▻◿◺◸◹"))++ ("Tb" . ,(agda-input-to-string-list "◀▶▲▼"))+ ("Tw" . ,(agda-input-to-string-list "◁▷△▽"))++ ;; Squares.++ ("sq" . ,(agda-input-to-string-list "■□◼◻◾◽▣▢▤▥▦▧▨▩◧◨◩◪◫◰◱◲◳"))+ ("sqb" . ,(agda-input-to-string-list "■◼◾"))+ ("sqw" . ,(agda-input-to-string-list "□◻◽"))+ ("sq." . ("▣"))+ ("sqo" . ("▢"))++ ;; Rectangles.++ ("re" . ,(agda-input-to-string-list "▬▭▮▯"))+ ("reb" . ,(agda-input-to-string-list "▬▮"))+ ("rew" . ,(agda-input-to-string-list "▭▯"))++ ;; Parallelograms.++ ("pa" . ,(agda-input-to-string-list "▰▱"))+ ("pab" . ("▰"))+ ("paw" . ("▱"))++ ;; Diamonds.++ ("di" . ,(agda-input-to-string-list "◆◇◈"))+ ("dib" . ("◆"))+ ("diw" . ("◇"))+ ("di." . ("◈"))++ ;; Circles.++ ("ci" . ,(agda-input-to-string-list "●○◎◌◯◍◐◑◒◓◔◕◖◗◠◡◴◵◶◷⚆⚇⚈⚉"))+ ("cib" . ("●"))+ ("ciw" . ("○"))+ ("ci." . ("◎"))+ ("ci.." . ("◌"))+ ("ciO" . ("◯"))++ ;; Stars.++ ("st" . ,(agda-input-to-string-list "⋆✦✧✶✴✹ ★☆✪✫✯✰✵✷✸"))+ ("st4" . ,(agda-input-to-string-list "✦✧"))+ ("st6" . ("✶"))+ ("st8" . ("✴"))+ ("st12" . ("✹"))++ ;; Blackboard bold letters.++ ("bn" . ("ℕ"))+ ("bz" . ("ℤ"))+ ("bq" . ("ℚ"))+ ("br" . ("ℝ"))+ ("bc" . ("ℂ"))+ ("bp" . ("ℙ"))+ ("bsum" . ("⅀"))++ ;; Parentheses.++ ("(" . ,(agda-input-to-string-list "([{⁅⁽₍〈⎴⟦⟨⟪〈《「『【〔〖〚︵︷︹︻︽︿﹁﹃﹙﹛﹝([{「"))+ (")" . ,(agda-input-to-string-list ")]}⁆⁾₎〉⎵⟧⟩⟫〉》」』】〕〗〛︶︸︺︼︾﹀﹂﹄﹚﹜﹞)]}」"))++ ("[[" . ("⟦"))+ ("]]" . ("⟧"))+ ("<" . ("⟨"))+ (">" . ("⟩"))+ ("<<" . ("⟪"))+ (">>" . ("⟫"))++ ;; Primes.++ ("'" . ,(agda-input-to-string-list "′″‴⁗"))+ ("`" . ,(agda-input-to-string-list "‵‶‷"))++ ;; Fractions.++ ("frac" . ,(agda-input-to-string-list "¼½¾⅓⅔⅕⅖⅗⅘⅙⅚⅛⅜⅝⅞⅟"))++ ;; Bullets.++ ("bu" . ,(agda-input-to-string-list "•◦‣⁌⁍"))+ ("bub" . ("•"))+ ("buw" . ("◦"))+ ("but" . ("‣"))++ ;; Musical symbols.++ ("note" . ,(agda-input-to-string-list "♩♪♫♬"))+ ("b" . ("♭"))+ ("#" . ("♯"))++ ;; Other punctuation and symbols.++ ("\\" . ("\\"))+ ("en" . ("–"))+ ("em" . ("—"))+ ("^i" . ("ⁱ"))+ ("!!" . ("‼"))+ ("??" . ("⁇"))+ ("?!" . ("‽" "⁈"))+ ("!?" . ("⁉"))+ ("die" . ,(agda-input-to-string-list "⚀⚁⚂⚃⚄⚅"))+ ("asterisk" . ,(agda-input-to-string-list "⁎⁑⁂✢✣✤✥✱✲✳✺✻✼✽❃❉❊❋"))+ ("8<" . ("✂" "✄"))+ ("tie" . ("⁀"))+ ("undertie" . ("‿"))+ ("apl" . ,(agda-input-to-string-list "⌶⌷⌸⌹⌺⌻⌼⌽⌾⌿⍀⍁⍂⍃⍄⍅⍆⍇⍈+ ⍉⍊⍋⍌⍍⍎⍏⍐⍑⍒⍓⍔⍕⍖⍗⍘⍙⍚⍛+ ⍜⍝⍞⍟⍠⍡⍢⍣⍤⍥⍦⍧⍨⍩⍪⍫⍬⍭⍮+ ⍯⍰⍱⍲⍳⍴⍵⍶⍷⍸⍹⍺⎕"))++ ;; Shorter forms of many greek letters.++ ("Ga" . ("α")) ("GA" . ("Α"))+ ("Gb" . ("β")) ("GB" . ("Β"))+ ("Gg" . ("γ")) ("GG" . ("Γ"))+ ("Gd" . ("δ")) ("GD" . ("Δ"))+ ("Ge" . ("ε")) ("GE" . ("Ε"))+ ("Gz" . ("ζ")) ("GZ" . ("Ζ"))+ ;; \eta \Eta+ ("Gth" . ("θ")) ("GTH" . ("θ"))+ ("Gi" . ("ι")) ("GI" . ("Ι"))+ ("Gk" . ("κ")) ("GK" . ("Κ"))+ ("Gl" . ("λ")) ("GL" . ("Λ"))+ ("Gm" . ("μ")) ("GM" . ("Μ"))+ ("Gn" . ("ν")) ("GN" . ("Ν"))+ ("Gx" . ("ξ")) ("GX" . ("Ξ"))+ ;; \omicron \Omicron+ ;; \pi \Pi+ ("Gr" . ("ρ")) ("GR" . ("Ρ"))+ ("Gs" . ("σ")) ("GS" . ("Σ"))+ ("Gt" . ("τ")) ("GT" . ("Τ"))+ ("Gu" . ("υ")) ("GU" . ("Υ"))+ ("Gf" . ("φ")) ("GF" . ("Φ"))+ ("Gc" . ("χ")) ("GC" . ("Χ"))+ ("Gp" . ("ψ")) ("GP" . ("Ψ"))+ ("Go" . ("ω")) ("GO" . ("Ω"))++ ;; Some ISO8859-1 characters.++ (" " . (" "))+ ("!" . ("¡"))+ ("cent" . ("¢"))+ ("brokenbar" . ("¦"))+ ("degree" . ("°"))+ ("?" . ("¿"))+ ("^a_" . ("ª"))+ ("^o_" . ("º"))++ ,@(if (>= emacs-major-version 23)+ '(("pounds" . ("£"))+ ("currency" . ("¤"))+ ("yen" . ("¥"))+ ("S" . ("§"))+ ("\"{}" . ("¨"))+ ("copyright" . ("©"))+ ("flqq" . ("«"))+ ("\"<" . ("«"))+ ("-" . (""))+ ("registered" . ("®"))+ ("={}" . ("¯"))+ ("^2" . ("²"))+ ("^3" . ("³"))+ ("'{}" . ("´"))+ ("micro" . ("µ"))+ ("P" . ("¶"))+ ("c{}" . ("¸"))+ ("^1" . ("¹"))+ ("frqq" . ("»"))+ ("\">" . ("»"))+ ("frac14" . ("¼"))+ ("frac12" . ("½"))+ ("frac34" . ("¾"))+ ("`A" . ("À"))+ ("'A" . ("Á"))+ ("^A" . ("Â"))+ ("~A" . ("Ã"))+ ("\"A" . ("Ä"))+ ("AA" . ("Å"))+ ("AE" . ("Æ"))+ ("cC" . ("Ç"))+ ("`E" . ("È"))+ ("'E" . ("É"))+ ("^E" . ("Ê"))+ ("\"E" . ("Ë"))+ ("`I" . ("Ì"))+ ("'I" . ("Í"))+ ("^I" . ("Î"))+ ("\"I" . ("Ï"))+ ("DH" . ("Ð"))+ ("~N" . ("Ñ"))+ ("`O" . ("Ò"))+ ("'O" . ("Ó"))+ ("^O" . ("Ô"))+ ("~O" . ("Õ"))+ ("\"O" . ("Ö"))+ ("O" . ("Ø"))+ ("`U" . ("Ù"))+ ("'U" . ("Ú"))+ ("^U" . ("Û"))+ ("\"U" . ("Ü"))+ ("'Y" . ("Ý"))+ ("TH" . ("Þ"))+ ("ss" . ("ß"))+ ("`a" . ("à"))+ ("'a" . ("á"))+ ("^a" . ("â"))+ ("~a" . ("ã"))+ ("\"a" . ("ä"))+ ("aa" . ("å"))+ ("ae" . ("æ"))+ ("cc" . ("ç"))+ ("`e" . ("è"))+ ("'e" . ("é"))+ ("^e" . ("ê"))+ ("\"e" . ("ë"))+ ("`i" . ("ì"))+ ("'i" . ("í"))+ ("^i" . ("î"))+ ("\"i" . ("ï"))+ ("dh" . ("ð"))+ ("~n" . ("ñ"))+ ("`o" . ("ò"))+ ("'o" . ("ó"))+ ("^o" . ("ô"))+ ("~o" . ("õ"))+ ("\"o" . ("ö"))+ ("o" . ("ø"))+ ("`u" . ("ù"))+ ("'u" . ("ú"))+ ("^u" . ("û"))+ ("\"u" . ("ü"))+ ("'y" . ("ý"))+ ("th" . ("þ"))+ ("\"y" . ("ÿ"))))++ ;; Circled, parenthesised etc. numbers and letters.++ ( "(0)" . ,(agda-input-to-string-list " ⓪"))+ ( "(1)" . ,(agda-input-to-string-list "⑴①⒈❶➀➊"))+ ( "(2)" . ,(agda-input-to-string-list "⑵②⒉❷➁➋"))+ ( "(3)" . ,(agda-input-to-string-list "⑶③⒊❸➂➌"))+ ( "(4)" . ,(agda-input-to-string-list "⑷④⒋❹➃➍"))+ ( "(5)" . ,(agda-input-to-string-list "⑸⑤⒌❺➄➎"))+ ( "(6)" . ,(agda-input-to-string-list "⑹⑥⒍❻➅➏"))+ ( "(7)" . ,(agda-input-to-string-list "⑺⑦⒎❼➆➐"))+ ( "(8)" . ,(agda-input-to-string-list "⑻⑧⒏❽➇➑"))+ ( "(9)" . ,(agda-input-to-string-list "⑼⑨⒐❾➈➒"))+ ("(10)" . ,(agda-input-to-string-list "⑽⑩⒑❿➉➓"))+ ("(11)" . ,(agda-input-to-string-list "⑾⑪⒒"))+ ("(12)" . ,(agda-input-to-string-list "⑿⑫⒓"))+ ("(13)" . ,(agda-input-to-string-list "⒀⑬⒔"))+ ("(14)" . ,(agda-input-to-string-list "⒁⑭⒕"))+ ("(15)" . ,(agda-input-to-string-list "⒂⑮⒖"))+ ("(16)" . ,(agda-input-to-string-list "⒃⑯⒗"))+ ("(17)" . ,(agda-input-to-string-list "⒄⑰⒘"))+ ("(18)" . ,(agda-input-to-string-list "⒅⑱⒙"))+ ("(19)" . ,(agda-input-to-string-list "⒆⑲⒚"))+ ("(20)" . ,(agda-input-to-string-list "⒇⑳⒛"))++ ("(a)" . ,(agda-input-to-string-list "⒜Ⓐⓐ"))+ ("(b)" . ,(agda-input-to-string-list "⒝Ⓑⓑ"))+ ("(c)" . ,(agda-input-to-string-list "⒞Ⓒⓒ"))+ ("(d)" . ,(agda-input-to-string-list "⒟Ⓓⓓ"))+ ("(e)" . ,(agda-input-to-string-list "⒠Ⓔⓔ"))+ ("(f)" . ,(agda-input-to-string-list "⒡Ⓕⓕ"))+ ("(g)" . ,(agda-input-to-string-list "⒢Ⓖⓖ"))+ ("(h)" . ,(agda-input-to-string-list "⒣Ⓗⓗ"))+ ("(i)" . ,(agda-input-to-string-list "⒤Ⓘⓘ"))+ ("(j)" . ,(agda-input-to-string-list "⒥Ⓙⓙ"))+ ("(k)" . ,(agda-input-to-string-list "⒦Ⓚⓚ"))+ ("(l)" . ,(agda-input-to-string-list "⒧Ⓛⓛ"))+ ("(m)" . ,(agda-input-to-string-list "⒨Ⓜⓜ"))+ ("(n)" . ,(agda-input-to-string-list "⒩Ⓝⓝ"))+ ("(o)" . ,(agda-input-to-string-list "⒪Ⓞⓞ"))+ ("(p)" . ,(agda-input-to-string-list "⒫Ⓟⓟ"))+ ("(q)" . ,(agda-input-to-string-list "⒬Ⓠⓠ"))+ ("(r)" . ,(agda-input-to-string-list "⒭Ⓡⓡ"))+ ("(s)" . ,(agda-input-to-string-list "⒮Ⓢⓢ"))+ ("(t)" . ,(agda-input-to-string-list "⒯Ⓣⓣ"))+ ("(u)" . ,(agda-input-to-string-list "⒰Ⓤⓤ"))+ ("(v)" . ,(agda-input-to-string-list "⒱Ⓥⓥ"))+ ("(w)" . ,(agda-input-to-string-list "⒲Ⓦⓦ"))+ ("(x)" . ,(agda-input-to-string-list "⒳Ⓧⓧ"))+ ("(y)" . ,(agda-input-to-string-list "⒴Ⓨⓨ"))+ ("(z)" . ,(agda-input-to-string-list "⒵Ⓩⓩ"))++ ))+ "A list of translations specific to the Agda input method.+Each element is a pair (KEY-SEQUENCE-STRING . LIST-OF-TRANSLATION-STRINGS).+All the translation strings are possible translations+of the given key sequence; if there is more than one you can choose+between them using the arrow keys.++Note that if you customize this setting you will not+automatically benefit (or suffer) from modifications to its+default value when the library is updated. If you just want to+add some bindings it is probably a better idea to customize+`agda-input-user-translations'.++If you change this setting manually (without using the+customization buffer) you need to call `agda-input-setup' in+order for the change to take effect."+ :group 'agda-input+ :set 'agda-input-incorporate-changed-setting+ :initialize 'custom-initialize-default+ :type '(repeat (cons (string :tag "Key sequence")+ (repeat :tag "Translations" string))))+++(defcustom agda-input-user-translations nil+ "Like `agda-input-translations', but more suitable for user+customizations since by default it is empty."+ :group 'agda-input+ :set 'agda-input-incorporate-changed-setting+ :initialize 'custom-initialize-default+ :type '(repeat (cons (string :tag "Key sequence")+ (repeat :tag "Translations" string))))++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+;; Inspecting and modifying translation maps++(defun agda-input-get-translations (qp)+ "Return a list containing all translations from the Quail+package QP (except for those corresponding to ASCII).+Each pair in the list has the form (KEY-SEQUENCE . TRANSLATION)."+ (with-temp-buffer+ (activate-input-method qp) ; To make sure that the package is loaded.+ (unless (quail-package qp)+ (error "%s is not a Quail package." qp))+ (let ((decode-map (list 'decode-map)))+ (quail-build-decode-map (list (quail-map)) "" decode-map 0)+ (cdr decode-map))))++(defun agda-input-show-translations (qp)+ "Display all translations used by the Quail package QP (a string).+\(Except for those corresponding to ASCII)."+ (interactive (list (read-input-method-name+ "Quail input method (default %s): " "Agda")))+ (let ((buf (concat "*" qp " input method translations*")))+ (with-output-to-temp-buffer buf+ (with-current-buffer buf+ (quail-insert-decode-map+ (cons 'decode-map (agda-input-get-translations qp)))))))++(defun agda-input-add-translations (trans)+ "Add the given translations TRANS to the Agda input method.+TRANS is a list of pairs (KEY-SEQUENCE . TRANSLATION)."+ (with-temp-buffer+ (dolist (tr (agda-input-concat-map (eval agda-input-tweak-all) trans))+ (quail-defrule (car tr) (cdr tr) "Agda" t))))++(defun agda-input-inherit-package (qp &optional fun)+ "Let the Agda input method inherit the translations from the+Quail package QP (except for those corresponding to ASCII).++The optional function FUN can be used to modify the translations.+It is given a pair (KEY-SEQUENCE . TRANSLATION) and should return+a list of such pairs."+ (let ((trans (agda-input-get-translations qp)))+ (agda-input-add-translations+ (if fun (agda-input-concat-map fun trans)+ trans))))++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+;; Setting up the input method++(defun agda-input-setup ()+ "Set up the Agda input method based on the customisable+variables and underlying input methods."++ ;; Create (or reset) the input method.+ (with-temp-buffer+ (quail-define-package "Agda" "UTF-8" "∏" t ; guidance+ "Agda input method.+The purpose of this input method is to edit Agda programs, but+since it is highly customisable it can be made useful for other+tasks as well."+ nil nil nil nil nil nil t ; maximum-shortest+ ))++ (agda-input-add-translations+ (mapcar (lambda (tr) (cons (car tr) (vconcat (cdr tr))))+ (append agda-input-user-translations+ agda-input-translations)))+ (dolist (def agda-input-inherit)+ (agda-input-inherit-package (car def)+ (eval (cdr def)))))++(defun agda-input-incorporate-changed-setting (sym val)+ "Update the Agda input method based on the customisable+variables and underlying input methods.+Suitable for use in the :set field of `defcustom'."+ (set-default sym val)+ (agda-input-setup))++;; Set up the input method.++(agda-input-setup)++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+;; Administrative details++(provide 'agda-input)+;;; agda-input.el ends here
+ src/data/emacs-mode/agda2-abbrevs.el view
@@ -0,0 +1,105 @@+;; agda2-abbrevs.el --- Default Agda abbrevs++;;; Commentary:++;;; Code:++;; Skeletons++(require 'skeleton)++(define-skeleton agda2-abbrevs-module+ "Inserts a module header template."+ nil+ "module " _ " where\n")++(define-skeleton agda2-abbrevs-data+ "Inserts a data template."+ nil+ "data " _ " : Set where\n")++(define-skeleton agda2-abbrevs-codata+ "Inserts a codata template."+ nil+ "codata " _ " : Set where\n")++(define-skeleton agda2-abbrevs-record+ "Inserts a record type template."+ nil+ "record " _ " : Set where\n"+ " field\n")++(define-skeleton agda2-abbrevs-record-value+ "Inserts a record value template."+ nil+ "record {" _ "}")++(define-skeleton agda2-abbrevs-using+ "Inserts a using template."+ nil+ "using (" _ ")")++(define-skeleton agda2-abbrevs-hiding+ "Inserts a hiding template."+ nil+ "hiding (" _ ")")++(define-skeleton agda2-abbrevs-renaming+ "Inserts a renaming template."+ nil+ "renaming (" _ " to " _ ")")++(define-skeleton agda2-abbrevs-forall+ "Inserts a forall template."+ nil+ "∀ {" _ "} ")++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+;; Abbrevs++(defvar agda2-abbrevs-defaults '(+ ("m" "" agda2-abbrevs-module)+ ("d" "" agda2-abbrevs-data)+ ("c" "" agda2-abbrevs-codata)+ ("re" "" agda2-abbrevs-record)+ ("rv" "" agda2-abbrevs-record-value)+ ("u" "" agda2-abbrevs-using)+ ("h" "" agda2-abbrevs-hiding)+ ("r" "" agda2-abbrevs-renaming)+ ("w" "where\n")+ ("po" "postulate")+ ("a" "abstract\n")+ ("pr" "private\n")+ ("pu" "public")+ ("mu" "mutual\n")+ ("f" "" agda2-abbrevs-forall)+ ("oi" "open import "))+ "Abbreviations defined by default in the Agda mode.")++(defcustom agda2-mode-abbrevs-use-defaults t+ "If non-nil include the default Agda mode abbrevs in `agda2-mode-abbrev-table'.+The abbrevs are designed to be expanded explicitly, so users of `abbrev-mode'+probably do not want to include them.++Restart Emacs in order for this change to take effect."+ :group 'agda2+ :type '(choice (const :tag "Yes" t)+ (const :tag "No" nil)))++(defvar agda2-mode-abbrev-table nil+ "Agda mode abbrev table.")++(define-abbrev-table+ 'agda2-mode-abbrev-table+ (if agda2-mode-abbrevs-use-defaults+ (mapcar (lambda (abbrev)+ (append abbrev+ (make-list (- 4 (length abbrev)) nil)+ '((:system t))))+ agda2-abbrevs-defaults)))++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+;; Administrative details++(provide 'agda2-abbrevs)+;;; agda2-abbrevs.el ends here
+ src/data/emacs-mode/agda2-highlight.el view
@@ -0,0 +1,314 @@+;;; agda2-highlight.el --- Syntax highlighting for Agda (version ≥ 2)++;;; Commentary:++;; Code to apply syntactic highlighting to Agda source code. This uses+;; Agda's own annotations to figure out what is what, so the parsing+;; is always done correctly, but highlighting is not done on the fly.++;;; Code:++(require 'annotation)+(require 'font-lock)++(defgroup agda2-highlight nil+ "Syntax highlighting for Agda."+ :group 'agda2)++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+;; Functions for setting faces++(defun agda2-highlight-set-face-attribute (face attrs)+ "Reset (globally) all attributes of the face FACE according to ATTRS.+If the face does not exist, then it is created first."+ (make-face face)+ (set-face-attribute face nil+ :family 'unspecified+ :width 'unspecified+ :height 'unspecified+ :weight 'unspecified+ :slant 'unspecified+ :foreground 'unspecified+ :background 'unspecified+ :inverse-video 'unspecified+ :stipple 'unspecified+ :underline 'unspecified+ :overline 'unspecified+ :strike-through 'unspecified+ :inherit 'unspecified+ :box 'unspecified+ :font 'unspecified)+ (eval `(set-face-attribute face nil ,@attrs)))++(defun agda2-highlight-set-faces (variable group)+ "Set all Agda faces according to the value of GROUP.+Also sets the default value of VARIABLE to GROUP."+ (set-default variable group)+ (mapc (lambda (face-and-attrs)+ (agda2-highlight-set-face-attribute+ (car face-and-attrs) (cdr face-and-attrs)))+ (cond+ ((equal group 'conor)+ '((agda2-highlight-keyword-face+ :underline t)+ (agda2-highlight-string-face)+ (agda2-highlight-number-face)+ (agda2-highlight-symbol-face)+ (agda2-highlight-primitive-type-face+ :foreground "blue")+ (agda2-highlight-bound-variable-face+ :foreground "purple")+ (agda2-highlight-inductive-constructor-face+ :foreground "dark red")+ (agda2-highlight-coinductive-constructor-face+ :foreground "dark red")+ (agda2-highlight-datatype-face+ :foreground "blue")+ (agda2-highlight-field-face+ :foreground "dark red")+ (agda2-highlight-function-face+ :foreground "dark green")+ (agda2-highlight-module-face+ :foreground "dark green")+ (agda2-highlight-postulate-face+ :foreground "dark green")+ (agda2-highlight-primitive-face+ :foreground "dark green")+ (agda2-highlight-record-face+ :foreground "blue")+ (agda2-highlight-dotted-face)+ (agda2-highlight-error-face+ :foreground "black"+ :background "sandy brown")+ (agda2-highlight-unsolved-meta-face+ :foreground "black"+ :background "gold")+ (agda2-highlight-termination-problem-face+ :foreground "black"+ :background "red")+ (agda2-highlight-incomplete-pattern-face+ :foreground "black"+ :background "purple"))))))++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+;; Faces++(defcustom agda2-highlight-face-groups nil+ "Colour scheme to use for agda2 highlight faces.+Note that changing this option does not remove the customisations+below; you can get them back by resetting this option and+restarting Emacs."+ :type '(choice+ (const :tag "Use the settings below." nil)+ (const :tag "Use an approximation of Conor McBride's colour scheme."+ conor))+ :group 'agda2-highlight+ :set 'agda2-highlight-set-faces)++(defface agda2-highlight-keyword-face+ '((t (:foreground "DarkOrange3")))+ "The face used for keywords."+ :group 'agda2-highlight)++(defface agda2-highlight-string-face+ '((t (:foreground "firebrick")))+ "The face used for strings."+ :group 'agda2-highlight)++(defface agda2-highlight-number-face+ '((t (:foreground "purple")))+ "The face used for numbers."+ :group 'agda2-highlight)++(defface agda2-highlight-symbol-face+ '((((background light))+ (:foreground "gray25"))+ (((background dark))+ (:foreground "gray75")))+ "The face used for symbols like forall, =, ->, etc."+ :group 'agda2-highlight)++(defface agda2-highlight-primitive-type-face+ '((t (:foreground "medium blue")))+ "The face used for primitive types (like Set and Prop)."+ :group 'agda2-highlight)++(defface agda2-highlight-bound-variable-face+ '((t nil))+ "The face used for bound variables."+ :group 'agda2-highlight)++(defface agda2-highlight-inductive-constructor-face+ '((t (:foreground "green4")))+ "The face used for inductive constructors."+ :group 'agda2-highlight)++(defface agda2-highlight-coinductive-constructor-face+ '((t (:foreground "gold4")))+ "The face used for coinductive constructors."+ :group 'agda2-highlight)++(defface agda2-highlight-datatype-face+ '((t (:foreground "medium blue")))+ "The face used for datatypes."+ :group 'agda2-highlight)++(defface agda2-highlight-field-face+ '((t (:foreground "DeepPink2")))+ "The face used for record fields."+ :group 'agda2-highlight)++(defface agda2-highlight-function-face+ '((t (:foreground "medium blue")))+ "The face used for functions."+ :group 'agda2-highlight)++(defface agda2-highlight-module-face+ '((t (:foreground "purple")))+ "The face used for module names."+ :group 'agda2-highlight)++(defface agda2-highlight-postulate-face+ '((t (:foreground "medium blue")))+ "The face used for postulates."+ :group 'agda2-highlight)++(defface agda2-highlight-primitive-face+ '((t (:foreground "medium blue")))+ "The face used for primitive functions."+ :group 'agda2-highlight)++(defface agda2-highlight-record-face+ '((t (:foreground "medium blue")))+ "The face used for record types."+ :group 'agda2-highlight)++(defface agda2-highlight-dotted-face+ '((t nil))+ "The face used for dotted patterns."+ :group 'agda2-highlight)++(defface agda2-highlight-operator-face+ '((t nil))+ "The face used for operators."+ :group 'agda2-highlight)++(defface agda2-highlight-error-face+ '((t (:foreground "red" :underline t)))+ "The face used for errors."+ :group 'agda2-highlight)++(defface agda2-highlight-unsolved-meta-face+ '((t (:background "yellow"+ :foreground "black")))+ "The face used for unsolved meta variables."+ :group 'agda2-highlight)++(defface agda2-highlight-termination-problem-face+ '((t (:background "light salmon"+ :foreground "black")))+ "The face used for termination problems."+ :group 'agda2-highlight)++(defface agda2-highlight-incomplete-pattern-face+ '((t (:background "wheat"+ :foreground "black")))+ "The face used for incomplete patterns. (Currently unused.)"+ :group 'agda2-highlight)++(defvar agda2-highlight-faces+ '((keyword . agda2-highlight-keyword-face)+ (string . agda2-highlight-string-face)+ (number . agda2-highlight-number-face)+ (symbol . agda2-highlight-symbol-face)+ (primitivetype . agda2-highlight-primitive-type-face)+ (bound . agda2-highlight-bound-variable-face)+ (inductiveconstructor . agda2-highlight-inductive-constructor-face)+ (coinductiveconstructor . agda2-highlight-coinductive-constructor-face)+ (datatype . agda2-highlight-datatype-face)+ (field . agda2-highlight-field-face)+ (function . agda2-highlight-function-face)+ (module . agda2-highlight-module-face)+ (postulate . agda2-highlight-postulate-face)+ (primitive . agda2-highlight-primitive-face)+ (record . agda2-highlight-record-face)+ (dotted . agda2-highlight-dotted-face)+ (operator . agda2-highlight-operator-face)+ (error . agda2-highlight-error-face)+ (unsolvedmeta . agda2-highlight-unsolved-meta-face)+ (terminationproblem . agda2-highlight-termination-problem-face)+ (incompletepattern . agda2-highlight-incomplete-pattern-face))+ "Alist mapping code aspects to the face used when displaying them.++The aspects currently recognised are the following:++`bound' Bound variables.+`coinductiveconstructor' Coinductive constructors.+`datatype' Data types.+`dotted' Dotted patterns.+`error' Errors.+`field' Record fields.+`function' Functions.+`incompletepattern' Incomplete patterns.+`inductiveconstructor' Inductive constructors.+`keyword' Keywords.+`module' Module names.+`number' Numbers.+`operator' Operators.+`postulate' Postulates.+`primitive' Primitive functions.+`primitivetype' Primitive types (like Set and Prop).+`record' Record types.+`string' Strings.+`symbol' Symbols like forall, =, ->, etc.+`terminationproblem' Termination problems.+`unsolvedmeta' Unsolved meta variables.++The following aspect is ignored:++`comment' Comments.++Comments are handled by Font Lock mode (which uses the syntax+table). The face `font-lock-comment-face' is used for comments.")++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+;; Functions++(defun agda2-highlight-reload nil+ "Reload current buffer's syntax information from the syntax file."+ (interactive)+ (let* ((dir (file-name-directory buffer-file-name))+ (name (file-name-nondirectory buffer-file-name))+ (file (concat dir "." name ".el"))+ (inhibit-read-only t))+ ;; Ignore read-only status, otherwise this function may fail.+ (annotation-load-file+ file+ ;; Do not remove the old annotations if all the new ones+ ;; correspond to errors, or if there are no new ones.+ (lambda (anns) (not (member anns '((error) nil)))))))++(defun agda2-highlight-setup nil+ "Set up the `annotation' library for use with `agda2-mode'."+ (font-lock-mode 0)+ (setq annotation-bindings agda2-highlight-faces))++(defun agda2-highlight-clear nil+ "Remove all syntax highlighting added by `agda2-highlight-reload'."+ (interactive)+ (let ((inhibit-read-only t))+ ; Ignore read-only status, otherwise this function may fail.+ (annotation-remove-annotations)))++(defun agda2-highlight-reload-or-clear (&optional arg)+ "Reload syntax highlighting information.+With prefix argument ARG: Remove syntax highlighting."+ (interactive "P")+ (if arg (agda2-highlight-clear)+ (agda2-highlight-reload)))++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+;; Administrative details++(provide 'agda2-highlight)+;;; agda2-highlight.el ends here
+ src/data/emacs-mode/agda2-mode.el view
@@ -0,0 +1,1004 @@+;;; agda2-mode.el --- Major mode for Agda2++;;; Commentary:++;; ++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+;;;; Dependency+++;;; Code:++(defvar agda2-version "2.2.2"+ "The version of the Agda mode.+Note that, by default, the same version of the underlying Haskell+library is used (see `agda2-ghci-options').")++(require 'cl) ; haskell-indent requires it anyway.+(set (make-local-variable 'lisp-indent-function)+ 'common-lisp-indent-function)+(require 'comint)+(require 'pp)+(require 'eri)+(require 'annotation)+(require 'agda-input)+(require 'agda2-highlight)+(require 'agda2-abbrevs)+(require 'haskell-indent)+(require 'haskell-ghci)+;; due to a bug in haskell-mode-2.1+(setq haskell-ghci-mode-map (copy-keymap comint-mode-map))+;; Load filladapt, if it is installed.+(condition-case nil+ (require 'filladapt)+ (error nil))+(unless (fboundp 'overlays-in) (load "overlay")) ; for Xemacs+(unless (fboundp 'propertize) ; for Xemacs 21.4+ (defun propertize (string &rest properties)+ "Return a copy of STRING with text properties added.+First argument is the string to copy.+Remaining arguments form a sequence of PROPERTY VALUE pairs for text+properties to add to the result."+ (let ((str (copy-sequence string)))+ (add-text-properties 0 (length str) properties str)+ str)))+(unless (fboundp 'run-mode-hooks)+ (fset 'run-mode-hooks 'run-hooks)) ; For Emacs versions < 21.++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+;;;; Programming utilities++(defmacro agda2-protect (form &optional default)+ "Expands to (condition-case nil FORM (error DEFAULT))."+ `(condition-case nil ,form (error ,default)))+(put 'agda2-protect 'lisp-indent-function 0)++(defmacro agda2-let (varbind funcbind &rest body)+ "Expands to (let* VARBIND (labels FUNCBIND BODY...))."+ `(let* ,varbind (labels ,funcbind ,@body)))+(put 'agda2-let 'lisp-indent-function 2)++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+;;;; User options++(defgroup agda2 nil+ "Major mode for interactively developing Agda programs."+ :group 'languages)++(defcustom agda2-include-dirs+ '(".")+ "The directories Agda uses to search for files.+The directory names should be relative to the root of the current project."+ :type '(repeat directory)+ :group 'agda2)++(defcustom agda2-ghci-options+ (list (concat "-package Agda-" agda2-version))+ "Options set in GHCi before loading `agda2-toplevel-module'.+Note that only dynamic options can be set using this variable."+ :type '(repeat string)+ :group 'agda2)++(defcustom agda2-toplevel-module "Agda.Interaction.GhciTop"+ "The name of the Agda2 toplevel module."+ :type 'string :group 'agda2)++(defcustom agda2-mode-hook+ '(agda2-fix-ghci-for-windows)+ "Hooks for `agda2-mode'."+ :type 'hook :group 'agda2)++(defcustom agda2-indentation+ 'eri+ "*The kind of indentation used in `agda2-mode'."+ :type '(choice (const :tag "Haskell" haskell)+ (const :tag "Extended relative" eri)+ (const :tag "None" nil))+ :group 'agda2)++(defcustom agda2-information-window-max-height+ 0.35+ "*The maximum height of the information window.+A multiple of the frame height."+ :type 'number+ :group 'agda2)++(defcustom agda2-fontset-name+ (unless (eq window-system 'mac) "fontset-agda2")+ "Default font to use in the selected frame when activating the Agda2 mode.+This is only used if it's non-nil and Emacs is not running in a terminal.+It is also ignored in Emacs 23 and up, where the improved font handling makes+it unnecessary.++Note that this setting (if non-nil) affects non-Agda buffers as+well, and that you have to restart Emacs if you want settings to+this variable to take effect."+ :type '(choice (string :tag "Fontset name")+ (const :tag "Do not change the font" nil))+ :group 'agda2)++(defcustom agda2-fontset-spec-of-fontset-agda2+ "-*-fixed-Medium-r-Normal-*-18-*-*-*-c-*-fontset-agda2,+ ascii:-Misc-Fixed-Medium-R-Normal--18-120-100-100-C-90-ISO8859-1,+ latin-iso8859-2:-*-Fixed-*-r-*-*-18-*-*-*-c-*-iso8859-2,+ latin-iso8859-3:-*-Fixed-*-r-*-*-18-*-*-*-c-*-iso8859-3,+ latin-iso8859-4:-*-Fixed-*-r-*-*-18-*-*-*-c-*-iso8859-4,+ cyrillic-iso8859-5:-*-Fixed-*-r-*-*-18-*-*-*-c-*-iso8859-5,+ greek-iso8859-7:-*-Fixed-*-r-*-*-18-*-*-*-c-*-iso8859-7,+ latin-iso8859-9:-*-Fixed-*-r-*-*-18-*-*-*-c-*-iso8859-9,+ mule-unicode-0100-24ff:-Misc-Fixed-Medium-R-Normal--18-120-100-100-C-90-ISO10646-1,+ mule-unicode-2500-33ff:-Misc-Fixed-Medium-R-Normal--18-120-100-100-C-90-ISO10646-1,+ mule-unicode-e000-ffff:-Misc-Fixed-Medium-R-Normal--18-120-100-100-C-90-ISO10646-1,+ japanese-jisx0208:-Misc-Fixed-Medium-R-Normal-ja-18-*-*-*-C-*-JISX0208.1990-0,+ japanese-jisx0212:-Misc-Fixed-Medium-R-Normal-ja-18-*-*-*-C-*-JISX0212.1990-0,+ thai-tis620:-Misc-Fixed-Medium-R-Normal--24-240-72-72-C-120-TIS620.2529-1,+ lao:-Misc-Fixed-Medium-R-Normal--24-240-72-72-C-120-MuleLao-1,+ tibetan:-TibMdXA-fixed-medium-r-normal--16-160-72-72-m-160-MuleTibetan-0,+ tibetan-1-column:-TibMdXA-fixed-medium-r-normal--16-160-72-72-m-80-MuleTibetan-1,+ korean-ksc5601:-Daewoo-Mincho-Medium-R-Normal--16-120-100-100-C-160-KSC5601.1987-0,+ chinese-gb2312:-ISAS-Fangsong ti-Medium-R-Normal--16-160-72-72-c-160-GB2312.1980-0,+ chinese-cns11643-1:-HKU-Fixed-Medium-R-Normal--16-160-72-72-C-160-CNS11643.1992.1-0,+ chinese-big5-1:-ETen-Fixed-Medium-R-Normal--16-150-75-75-C-160-Big5.ETen-0,+ chinese-big5-2:-ETen-Fixed-Medium-R-Normal--16-150-75-75-C-160-Big5.ETen-0"+ "Specification of the \"fontset-agda2\" fontset.+The \"fontset-agda2\" is the standard setting for `agda2-fontset-name'.+If `agda2-fontset-name' is nil, or Emacs is+run in a terminal, then \"fontset-agda2\" is not created.++Note that the text \"fontset-agda2\" has to be part of the+string (in a certain way; see the default setting) in order for the+agda2 fontset to be created properly.++Note also that the default setting may not work unless suitable+fonts are installed on your system. Refer to the README file+accompanying the Agda distribution for details.++Note finally that you have to restart Emacs if you want settings+to this variable to take effect."+ :group 'agda2+ :type 'string)++(if (and agda2-fontset-name window-system)+ (create-fontset-from-fontset-spec agda2-fontset-spec-of-fontset-agda2 t t))++(defun agda2-fix-ghci-for-windows ()+ (if (string-match "windows" system-configuration)+ (setq haskell-ghci-program-name "ghc"+ haskell-ghci-program-args '("--interactive"))))++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+;;;; Global and buffer-local vars, initialization++(defvar agda2-mode-syntax-table+ (let ((tbl (make-syntax-table)))+ ;; Set the syntax of every char to "w" except for those whose default+ ;; syntax in `standard-syntax-table' is `paren' or `whitespace'.+ (map-char-table (lambda (keys val)+ ;; `keys' here can be a normal char, a generic char+ ;; (Emacs<23), or a char range (Emacs>=23).+ (unless (memq (car val)+ (eval-when-compile+ (mapcar 'car+ (list (string-to-syntax "(")+ (string-to-syntax ")")+ (string-to-syntax " ")))))+ (modify-syntax-entry keys "w" tbl)))+ (standard-syntax-table))+ ;; Then override the remaining special cases.+ (dolist (cs '((?{ . "(}1n") (?} . "){4n") (?- . "w 123b") (?\n . "> b")+ (?. . ".") (?\; . ".") (?_ . ".") (?! . ".")))+ (modify-syntax-entry (car cs) (cdr cs) tbl))+ tbl)+ "Syntax table used by the Agda 2 mode:++{} | Comment characters, matching parentheses.+- | Comment character, word constituent.+\n | Comment ender.+.;_! | Punctuation.++Remaining characters inherit their syntax classes from the+standard syntax table if that table treats them as matching+parentheses or whitespace. Otherwise they are treated as word+constituents.")++(defconst agda2-command-table+ `(+ (agda2-load "\C-c\C-l" (global) "Load")+ (agda2-load "\C-c\C-x\C-l")+ (agda2-compile "\C-c\C-x\C-c" (global) "Compile")+ (agda2-text-state "\C-c\C-x\C-d" (global) "Deactivate Agda")+ (agda2-quit "\C-c\C-x\C-q" (global) "Quit")+ (agda2-restart "\C-c\C-x\C-r" (global) "Restart")+ (agda2-display-implicit-arguments "\C-c\C-x\C-h" (global) "Toggle display of hidden arguments")+ (agda2-highlight-reload-or-clear "\C-c\C-x\C-s" (global) "Reload syntax highlighting information")+ (agda2-show-constraints ,(kbd "C-c C-=") (global) "Show constraints")+ (agda2-solveAll ,(kbd "C-c C-s") (global) "Solve constraints")+ (agda2-show-goals ,(kbd "C-c C-?") (global) "Show goals")+ (agda2-next-goal "\C-c\C-f" (global) "Next goal") ; Forward.+ (agda2-previous-goal "\C-c\C-b" (global) "Previous goal") ; Back.+ (agda2-give ,(kbd "C-c C-SPC") (local) "Give")+ (agda2-refine "\C-c\C-r" (local) "Refine")+ (agda2-make-case "\C-c\C-c" (local) "Case")+ (agda2-goal-type "\C-c\C-t" (local) "Goal type")+ (agda2-show-context "\C-c\C-e" (local) "Context (environment)")+ (agda2-infer-type-maybe-toplevel "\C-c\C-d" (local global) "Infer (deduce) type")+ (agda2-goal-and-context ,(kbd "C-c C-,") (local) "Goal type and context")+ (agda2-goal-and-context-and-inferred ,(kbd "C-c C-.") (local) "Goal type, context and inferred type")+ (agda2-compute-normalised-maybe-toplevel "\C-c\C-n" (local global) "Evaluate term to normal form")+ (agda2-indent ,(kbd "TAB"))+ (agda2-indent-reverse [S-iso-lefttab])+ (agda2-indent-reverse [S-lefttab])+ (agda2-indent-reverse [S-tab])+ (agda2-goto-definition-mouse [mouse-2])+ (agda2-goto-definition-keyboard "\M-.")+ (agda2-go-back "\M-*")+ )+ "Table of commands, used to build keymaps and menus.+Each element has the form (CMD KEY &optional NAME GOAL-NAME)+Where NAME is the name to use in the main Agda2 menu+and GOAL-NAME is for the Agda goal menu.")++(defvar agda2-mode-map+ (let ((map (make-sparse-keymap "Agda mode")))+ (define-key map [menu-bar Agda2]+ (cons "Agda2" (make-sparse-keymap "Agda2")))+ (define-key map [down-mouse-3] 'agda2-popup-menu-3)+ (dolist (d (reverse agda2-command-table))+ (destructuring-bind (f &optional keys kinds desc) d+ (if keys (define-key map keys f))+ (if (member 'global kinds)+ (define-key map+ (vector 'menu-bar 'Agda2 (intern desc)) (cons desc f)))))+ map)+ "Keymap for `agda2-mode'.")++(defvar agda2-goal-map+ (let ((map (make-sparse-keymap "Agda goal")))+ (dolist (d (reverse agda2-command-table))+ (destructuring-bind (f &optional keys kinds desc) d+ (if (member 'local kinds)+ (define-key map+ (vector (intern desc)) (cons desc f)))))+ map)+ "Keymap for agda2 goal menu.")++(defvar agda2-buffer nil "Agda subprocess buffer. Set in `agda2-restart'.")+(defvar agda2-process nil "Agda subprocess. Set in `agda2-restart'.")++;; Some buffer locals+(defvar agda2-buffer-external-status ""+ "External status of an `agda2-mode' buffer (dictated by the Haskell side).")+(make-variable-buffer-local 'agda2-buffer-external-status)++(defconst agda2-help-address+ ""+ "Address accepting submissions of bug reports and questions.")++;; Annotation for a goal+;; {! .... !}+;; ---------- overlay: agda2-gn num, face highlight, after-string num,+;; modification-hooks (agda2-protect-goal-markers)+;; - text-props: category agda2-delim1+;; - text-props: category agda2-delim2+;; - text-props: category agda2-delim3+;; - text-props: category agda2-delim4+;;+;; Char categories for {! ... !}+(defvar agda2-open-brace "{")+(defvar agda2-close-brace " }")+(setplist 'agda2-delim1 `(display ,agda2-open-brace))+(setplist 'agda2-delim2 `(display ,agda2-open-brace rear-nonsticky t+ agda2-delim2 t))+(setplist 'agda2-delim3 `(display ,agda2-close-brace agda2-delim3 t))+(setplist 'agda2-delim4 `(display ,agda2-close-brace rear-nonsticky t))++;; Note that strings used with the display property are compared by+;; reference. If the agda2-*-brace definitions were inlined, then+;; goals would be displayed as "{{ }}n" instead of "{ }n".++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+;;;; agda2-mode++;;;###autoload+(add-to-list 'auto-mode-alist '("\\.l?agda\\'" . agda2-mode))+;;;###autoload+(modify-coding-system-alist 'file "\\.l?agda\\'" 'utf-8)+;;;###autoload+(define-derived-mode agda2-mode nil "Agda2"+ "Major mode for agda2 files.++Note that when this mode is activated the default font of the+current frame is changed to the fontset `agda2-fontset-name'.+The reason is that Agda programs often use mathematical symbols+and other Unicode characters, so we try to provide a suitable+default font setting, which can display many of the characters+encountered. If you prefer to use your own settings, set+`agda2-fontset-name' to nil.++Special commands:+\\{agda2-mode-map}"+ (setq local-abbrev-table agda2-mode-abbrev-table+ indent-tabs-mode nil+ mode-line-process+ '((:eval (unless (eq 0 (length agda2-buffer-external-status))+ (concat ":" agda2-buffer-external-status)))))+ (let ((l '(max-specpdl-size 2600+ max-lisp-eval-depth 2800)))+ (while l (set (make-local-variable (pop l)) (pop l))))+ (if (and window-system agda2-fontset-name+ ;; Emacs-23 uses a revamped font engine which should make+ ;; agda2-fontset-name unnecessary in most cases. And if it turns out+ ;; to be necessary, we should probably use face-remapping-alist+ ;; rather than set-frame-font so the special font only applies to+ ;; Agda buffers, and so it applies in all frames where Agda+ ;; buffers are displayed.+ (not (boundp 'face-remapping-alist)))+ (condition-case nil+ (set-frame-font agda2-fontset-name)+ (error (error "Unable to change the font; change agda2-fontset-name or tweak agda2-fontset-spec-fontset-agda2"))))+ (agda2-indent-setup)+ (agda2-highlight-setup)+ (agda2-highlight-reload)+ (agda2-comments-and-paragraphs-setup)+ (force-mode-line-update)+ (set-input-method "Agda"))++(defun agda2-restart ()+ "Kill and restart the *ghci* buffer and load `agda2-toplevel-module'."+ (interactive)+ (save-excursion (let ((agda2-bufname "*ghci*")+ (ignore-dot-ghci "-ignore-dot-ghci"))+ (agda2-protect (kill-buffer agda2-bufname))+ ;; Make sure that the user's .ghci is not read.+ ;; Users can override this by adding+ ;; "-read-dot-ghci" to+ ;; `haskell-ghci-program-args'.+ (unless (equal (car-safe haskell-ghci-program-args)+ ignore-dot-ghci)+ (set (make-local-variable 'haskell-ghci-program-args)+ (cons ignore-dot-ghci haskell-ghci-program-args)))+ (haskell-ghci-start-process nil)+ (setq agda2-process haskell-ghci-process+ agda2-buffer haskell-ghci-process-buffer+ mode-name "Agda2 GHCi")+ (set-buffer-file-coding-system 'utf-8)+ (set-buffer-process-coding-system 'utf-8 'utf-8)+ (rename-buffer agda2-bufname)))+ (apply 'agda2-go ":set" agda2-ghci-options)+ (agda2-go ":mod +" agda2-toplevel-module)+ (agda2-text-state))++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+;;;; Communicating with Agda2++(defun agda2-go (&rest args)+ "Send the list ARGS of strings to ghci, then+wait for output and execute responses, if any"+ (interactive)+ (unless (eq 'run (agda2-process-status))+ ;; Try restarting automatically, but only once, in case there is+ ;; some major problem.+ (agda2-restart)+ (unless (eq 'run (agda2-process-status))+ (error "Problem encountered. The *ghci* buffer can perhaps explain why.")))+ (save-excursion+ (haskell-ghci-go (apply 'concat (agda2-intersperse " " args)) nil))+ ;;(display-buffer agda2-buffer 'not-tihs-window)+ (let (response)+ (with-current-buffer haskell-ghci-process-buffer+ (haskell-ghci-wait-for-output)+ ;; Note that the following code may be prone to race conditions+ ;; (make-temp-file returns a filename, not an open file). This is+ ;; not likely to be a problem, though.+ (let ((tempfile (make-temp-file "agda2-mode")))+ (unwind-protect+ (progn+ (comint-write-output tempfile)+ (with-temp-buffer+ (insert-file-contents tempfile)+ (setq response (buffer-substring-no-properties+ (point-min) (point-max)))))+ (delete-file tempfile))))+ (agda2-respond response)))++(defun agda2-goal-cmd (cmd &optional want ask &rest args)+ "When in a goal, send CMD, goal num and range, and strings ARGS to agda2.+WANT is an optional prompt. When ASK is non-nil, use minibuffer."+ (multiple-value-bind (o g) (agda2-goal-at (point))+ (unless g (error "For this command, please place the cursor in a goal"))+ (let ((txt (buffer-substring-no-properties (+ (overlay-start o) 2)+ (- (overlay-end o) 2))))+ (if (not want) (setq txt "")+ (when (or ask (string-match "\\`\\s *\\'" txt))+ (setq txt (read-string (concat want ": ") txt))))+ (apply 'agda2-go cmd+ (format "%d" g)+ (agda2-goal-Range o)+ (agda2-string-quote txt) args))))++;; Note that the following function is a security risk, since it+;; evaluates code without first inspecting it. The code (supposedly)+;; comes from the Agda backend, but there could be bugs in the backend+;; which can be exploited by an attacker which manages to trick+;; someone into type-checking compromised Agda code.++(defun agda2-respond (response)+ "Execute 'agda2_mode_code<sexp>' within RESPONSE string."+ (while (string-match "agda2_mode_code" response)+ (setq response (substring response (match-end 0)))+ (let ((inhibit-read-only t))+ (eval (read response)))))++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+;;;; User commands and response processing++(defun agda2-load ()+ "Load current buffer."+ (interactive)+ (agda2-go "cmd_load"+ (agda2-string-quote (buffer-file-name))+ (agda2-list-quote agda2-include-dirs)+ ))++(defun agda2-compile ()+ "Compile the current module."+ (interactive)+ (agda2-go "cmd_compile"+ (agda2-string-quote (buffer-file-name))+ (agda2-list-quote agda2-include-dirs)+ ))++(defun agda2-load-action (gs)+ "Annotate new goals GS in current buffer."+ (agda2-annotate gs))++(defun agda2-give()+ "Give to the goal at point the expression in it" (interactive)+ (agda2-goal-cmd "cmd_give" "expression to give"))++(defun agda2-give-action (old-g paren)+ "Update the goal OLD-G with the expression in it."+ (agda2-update old-g paren))++(defun agda2-refine ()+ "Refine the goal at point by the expression in it." (interactive)+ (agda2-goal-cmd "cmd_refine" "expression to refine"))++(defun agda2-make-case ()+ "Refine the pattern var given in the goal.+Assumes that <clause> = {!<var>!} is on one line."+ (interactive)+ (agda2-goal-cmd "cmd_make_case" "partten var to case"))++(defun agda2-make-case-action (newcls)+ "Replace the line at point with new clauses NEWCLS and reload."+ (agda2-forget-all-goals);; we reload later anyway.+ (let* ((p0 (point))+ ;; (p1 (goto-char (agda2-decl-beginning)))+ (p1 (goto-char (+ (current-indentation) (line-beginning-position))))+ (indent (current-column))+ cl)+ (goto-char p0)+ (re-search-forward "!}" (line-end-position) 'noerr)+ (delete-region p1 (point))+ (while (setq cl (pop newcls))+ (insert cl)+ (if newcls (insert "\n" (make-string indent ? ))))+ (goto-char p1))+ (agda2-load))++(defun agda2-status-action (status)+ "Display the string STATUS in the current buffer's mode line.+\(precondition: the current buffer has to use the Agda mode as the+major mode)."+ (setq agda2-buffer-external-status status))++(defun agda2-info-action (name text)+ "Insert TEXT into the Agda info buffer, display it, and display NAME+in the buffer's mode line."+ (interactive)+ (with-current-buffer (get-buffer-create "*Agda2 information*")+ (erase-buffer)+ (insert text)+ (set-syntax-table agda2-mode-syntax-table)+ (set-input-method "Agda")+ (goto-char (point-min))+ (put-text-property 0 (length name) 'face '(:weight bold) name)+ (setq mode-line-buffer-identification name)+ (save-selected-window+ (pop-to-buffer (current-buffer) 'not-this-window 'norecord)+ (shrink-window+ (- (window-height)+ (min (truncate+ (* (frame-height) agda2-information-window-max-height))+ (max window-min-height+ (1+ (count-lines (point-min) (point-max))))))))))++(defun agda2-show-goals()+ "Show all goals." (interactive)+ (agda2-go "cmd_metas"))++(defun agda2-show-constraints()+ "Show constraints." (interactive)+ (agda2-go "cmd_constraints"))++(defun agda2-text-state ()+ "UNDER CONSTRUCTION" (interactive)+ (dolist (o (overlays-in (point-min) (point-max)))+ (delete-overlay o))+ (agda2-go "cmd_reset")+ (let ((inhibit-read-only t))+ (annotation-preserve-mod-p-and-undo+ (set-text-properties (point-min) (point-max) '()))+ (force-mode-line-update)))++(defun agda2-next-goal () "Go to the next goal, if any." (interactive)+ (agda2-mv-goal 'next-single-property-change 'agda2-delim2 1 (point-min)))+(defun agda2-previous-goal () "Go to the previous goal, if any." (interactive)+ (agda2-mv-goal 'previous-single-property-change 'agda2-delim3 0 (point-max)))+(defun agda2-mv-goal (change delim adjust wrapped)+ (agda2-let ()+ ((go (p) (while (and (setq p (funcall change p 'category))+ (not (eq (get-text-property p 'category) delim))))+ (if p (goto-char (+ adjust p)))))+ (or (go (point)) (go wrapped) (message "No goals in the buffer"))))++(defun agda2-quit ()+ "Quit and clean up after agda2." (interactive)+ (agda2-protect (progn (kill-buffer agda2-buffer)+ (kill-buffer (current-buffer)))))+ +(defmacro agda2-maybe-normalised (name comment cmd prompt)+ "This macro constructs a function NAME which runs CMD.+COMMENT is used to build the function's comment. The function+NAME takes a prefix argument which tells whether it should+normalise types or not when running CMD (through+`agda2-goal-cmd'; PROMPT, if non-nil, is used as the goal command+prompt)."+ (let ((eval (make-symbol "eval")))+ `(defun ,name (&optional not-normalise)+ ,(concat comment ".++With a prefix argument the result is not explicitly normalised.")+ (interactive "P")+ (let ((,eval (if not-normalise "Instantiated" "Normalised")))+ (agda2-goal-cmd (concat ,cmd " Agda.Interaction.BasicOps." ,eval)+ ,prompt)))))++(defmacro agda2-maybe-normalised-toplevel (name comment cmd prompt)+ "This macro constructs a function NAME which runs CMD.+COMMENT is used to build the function's comments. The function+NAME takes a prefix argument which tells whether it should+normalise types or not when running CMD (through `agda2-go'; the+string PROMPT is used as the goal command prompt)."+ (let ((eval (make-symbol "eval")))+ `(defun ,name (not-normalise expr)+ ,(concat comment ".++With a prefix argument the result is not explicitly normalised.")+ (interactive ,(concat "P\nM" prompt ": "))+ (let ((,eval (if not-normalise "Instantiated" "Normalised")))+ (agda2-go (concat ,cmd " Agda.Interaction.BasicOps." ,eval " "+ (agda2-string-quote expr)))))))++(agda2-maybe-normalised+ agda2-goal-type+ "Show the type of the goal at point"+ "cmd_goal_type"+ nil)++(agda2-maybe-normalised+ agda2-infer-type+ "Infer the type of the goal at point"+ "cmd_infer"+ "expression to type")++(agda2-maybe-normalised-toplevel+ agda2-infer-type-toplevel+ "Infers the type of the given expression. The scope used for+the expression is that of the last point inside the current+top-level module"+ "cmd_infer_toplevel"+ "Expression")++(defun agda2-infer-type-maybe-toplevel ()+ "Infers the type of the given expression.+Either uses the scope of the current goal or, if point is not in a goal, the+top-level scope."+ (interactive)+ (call-interactively (if (agda2-goal-at (point))+ 'agda2-infer-type+ 'agda2-infer-type-toplevel)))++(agda2-maybe-normalised+ agda2-goal-and-context+ "Shows the type of the goal at point and the currect context"+ "cmd_goal_type_context"+ nil)++(agda2-maybe-normalised+ agda2-goal-and-context-and-inferred+ "Shows the context, the goal and the given expression's inferred type"+ "cmd_goal_type_context_infer"+ "expression to type")++(agda2-maybe-normalised+ agda2-show-context+ "Show the context of the goal at point"+ "cmd_context"+ nil)++(defun agda2-solveAll ()+ "Solve all goals that are internally already instantiated." (interactive)+ (agda2-go "cmd_solveAll" ))++(defun agda2-solveAll-action (iss)+ (save-excursion+ (while iss+ (let* ((g (pop iss)) (txt (pop iss)))+ (agda2-replace-goal g txt)+ (agda2-goto-goal g)+ (agda2-give)))))++(defun agda2-compute-normalised (&optional arg)+ "Compute the normal form of the expression in the goal at point.+With a prefix argument \"abstract\" is ignored during the computation."+ (interactive "P")+ (let ((cmd (concat "cmd_compute"+ (if arg " True" " False"))))+ (agda2-goal-cmd cmd "expression to normalise")))++(defun agda2-compute-normalised-toplevel (expr &optional arg)+ "Computes the normal form of the given expression.+The scope used for the expression is that of the last point inside the current+top-level module.+With a prefix argument \"abstract\" is ignored during the computation."+ (interactive "MExpression: \nP")+ (let ((cmd (concat "cmd_compute_toplevel"+ (if arg " True" " False")+ " ")))+ (agda2-go (concat cmd (agda2-string-quote expr)))))++(defun agda2-compute-normalised-maybe-toplevel ()+ "Computes the normal form of the given expression,+using the scope of the current goal or, if point is not in a goal, the+top-level scope.+With a prefix argument \"abstract\" is ignored during the computation."+ (interactive)+ (if (agda2-goal-at (point))+ (call-interactively 'agda2-compute-normalised)+ (call-interactively 'agda2-compute-normalised-toplevel)))++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+;;;;++(defun agda2-annotate (goals)+ "Annotates the goals in the current buffer with text properties.+The goal numbers should be given by GOALS (in the order they+appear in the buffer)."+ (agda2-forget-all-goals)+ (agda2-let (stk top)+ ((delims() (re-search-forward "[?]\\|[{][-!]\\|[-!][}]\\|--" nil t))+ (is-lone-questionmark ()+ (save-excursion+ (save-match-data+ (backward-char 3)+ (looking-at+ "\\(.[{(]\\|.\\s \\)[?]\\(\\s \\|[)};]\\|$\\)"))))+ (make(p) (agda2-make-goal p (point) (pop goals)))+ (err() (error "Unbalanced \{- , -\} , \{\! , \!\}")))+ (save-excursion+ (goto-char (point-min))+ (while (and goals (delims))+ (labels ((c (s) (equal s (match-string 0))))+ (cond+ ((and (c "--") (not stk)) (end-of-line))+ ((c "{-") (push nil stk))+ ((c "{!") (push (- (point) 2) stk))+ ((c "-}") (unless (and stk (not (pop stk))) (err)))+ ((c "!}") (if (and stk (setq top (pop stk)))+ (or stk (make top))+ (err)))+ ((c "?") (progn+ (when (and (not stk) (is-lone-questionmark))+ (delete-char -1)+ (insert "{!!}")+ (make (- (point) 4)))))))))))++(defun agda2-make-goal (p q n)+ "Make a goal with number N at <P>{!...!}<Q>. Assume the region is clean."+ (annotation-preserve-mod-p-and-undo+ (flet ((atp (x ps) (add-text-properties x (1+ x) ps)))+ (atp p '(category agda2-delim1))+ (atp (1+ p) '(category agda2-delim2))+ (atp (- q 2) '(category agda2-delim3))+ (atp (1- q) '(category agda2-delim4)))+ (let ((o (make-overlay p q nil t nil)))+ (overlay-put o 'modification-hooks '(agda2-protect-goal-markers))+ (overlay-put o 'agda2-gn n)+ (overlay-put o 'face 'highlight)+ (overlay-put o 'after-string (propertize (format "%s" n) 'face 'highlight)))))++(defun agda2-protect-goal-markers (ol action beg end &optional length)+ "Ensures that the goal markers cannot be tampered with.+Except if `inhibit-read-only' is non-nil or /all/ of the goal is+modified."+ (unless inhibit-read-only+ (if action+ ;; This is the after-change hook.+ nil+ ;; This is the before-change hook.+ (cond+ ((and (<= beg (overlay-start ol)) (>= end (overlay-end ol)))+ ;; The user is trying to remove the whole goal:+ ;; manually evaporate the overlay and add an undo-log entry so+ ;; it gets re-added if needed.+ (when (listp buffer-undo-list)+ (push (list 'apply 0 (overlay-start ol) (overlay-end ol)+ 'move-overlay ol (overlay-start ol) (overlay-end ol))+ buffer-undo-list))+ (delete-overlay ol))+ ((or (< beg (+ (overlay-start ol) 2))+ (> end (- (overlay-end ol) 2)))+ (signal 'text-read-only nil))))))++(defun agda2-update (old-g new-txt)+ "Update the goal OLD-G.+If NEW-TXT is a string, then the goal is replaced by the string,+and otherwise the text inside the goal is retained (parenthesised+if NEW-TXT is `'paren').++Removes the goal braces, but does not remove the goal overlay or+text properties."+ (multiple-value-bind (p q) (agda2-range-of-goal old-g)+ (save-excursion+ (cond ((stringp new-txt)+ (agda2-replace-goal old-g new-txt))+ ((equal new-txt 'paren)+ (goto-char (- q 2)) (insert ")")+ (goto-char (+ p 2)) (insert "(")))+ (multiple-value-bind (p q) (agda2-range-of-goal old-g)+ (delete-region (- q 2) q)+ (delete-region p (+ p 2))))))++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+;;;; Misc++(defun agda2-process-status ()+ "Status of `agda2-buffer', or \"no process\"."+ (agda2-protect (process-status agda2-process) "no process"))++(defun agda2-intersperse (sep xs) (interactive)+ (let(ys)(while xs (push (pop xs) ys)(push sep ys))(pop ys)(nreverse ys)))++(defun agda2-goal-Range (o)+ "Range of goal overlay O." (interactive)+ (format "(Range [Interval %s %s])"+ (agda2-mkPos (+ (overlay-start o) 2))+ (agda2-mkPos (- (overlay-end o) 2))))++(defun agda2-mkPos (&optional p)+ "Position value of P or point." (interactive)+ (save-excursion+ (if p (goto-char p))+ (format "(Pn \"%s\" %d %d %d)" (buffer-file-name)+ (point) (count-lines (point-min) (point)) (1+ (current-column)))))++(defun agda2-char-quote (c)+ "Convert character C to the notation used in Haskell strings.+The non-ASCII characters are actually rendered as+\"\\xNNNN\\&\", i.e. followed by a \"null character\", to avoid+problems if they are followed by digits. ASCII characters (code+points < 128) are converted to singleton strings."+ (if (< c 128)+ (list c)+ ;; FIXME: Why return a list rather than a string? --Stef+ (append (format "\\x%x\\&" (encode-char c 'ucs)) nil)))++(defun agda2-string-quote (s)+ "Convert string S into a string representing it in Haskell syntax.+Escape newlines, double quotes, etc.. in the string S, add+surrounding double quotes, and convert non-ASCII characters to the \\xNNNN+notation used in Haskell strings."+ (let ((pp-escape-newlines t))+ (mapconcat 'agda2-char-quote (pp-to-string s) "")))++(defun agda2-list-quote (strings)+ "Convert a list of STRINGS into a string representing it in Haskell syntax."+ (concat "[" (mapconcat 'agda2-string-quote strings ", ") "]"))++(defun agda2-goal-at(pos)+ "Return (goal overlay, goal number) at POS, or nil."+ (let ((os (and pos (overlays-at pos))) o g)+ (while (and os (not(setq g (overlay-get (setq o (pop os)) 'agda2-gn)))))+ (if g (list o g))))++(defun agda2-goal-overlay (g)+ "Returns the overlay of goal number G, if any."+ (car+ (remove nil+ (mapcar (lambda (o) (if (equal (overlay-get o 'agda2-gn) g) o))+ (overlays-in (point-min) (point-max))))))++(defun agda2-range-of-goal (g)+ "The range of goal G."+ (let ((o (agda2-goal-overlay g)))+ (if o (list (overlay-start o) (overlay-end o)))))++(defun agda2-goto-goal (g)+ (let ((p (+ 2 (car (agda2-range-of-goal g)))))+ (if p (goto-char p))))++(defun agda2-replace-goal (g newtxt)+ "Replace the content of goal G with NEWTXT." (interactive)+ (save-excursion+ (multiple-value-bind (p q) (agda2-range-of-goal g)+ (setq p (+ p 2) q (- q 2))+ (let ((indent (and (goto-char p) (current-column))))+ (delete-region p q) (insert newtxt)+ (while (re-search-backward "^" p t)+ (insert-char ? indent) (backward-char (1+ indent)))))))++(defun agda2-forget-all-goals ()+ "Remove all goal annotations.+\(Including some text properties which might be used by other+\(minor) modes.)"+ (annotation-preserve-mod-p-and-undo+ (remove-text-properties (point-min) (point-max)+ '(category nil agda2-delim2 nil agda2-delim3 nil+ display nil rear-nonsticky nil)))+ (let ((p (point-min)))+ (while (< (setq p (next-single-char-property-change p 'agda2-gn))+ (point-max))+ (delete-overlay (car (agda2-goal-at p))))))++(defun agda2-decl-beginning ()+ "Find the beginning point of the declaration containing the point.+To do: dealing with semicolon separated decls."+ (interactive)+ (save-excursion+ (let* ((pEnd (point))+ (pDef (progn (goto-char (point-min))+ (re-search-forward "\\s *" pEnd t)))+ (cDef (current-column)))+ (while (re-search-forward+ "where\\(\\s +\\)\\S \\|^\\(\\s *\\)\\S " pEnd t)+ (if (match-end 1)+ (setq pDef (goto-char (match-end 1))+ cDef (current-column))+ (goto-char (match-end 2))+ (if (>= cDef (current-column))+ (setq pDef (point)+ cDef (current-column))))+ (forward-char))+ (goto-char pDef)+ (if (equal (current-word) "mutual")+ (or (match-end 2) (match-end 1))+ pDef))))++(defun agda2-beginning-of-decl ()+ (interactive)+ (goto-char (agda2-decl-beginning)))++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+;;;; Indentation++(defun agda2-indent ()+ "This is what happens when TAB is pressed.+Depends on the setting of `agda2-indentation'."+ (interactive)+ (cond ((eq agda2-indentation 'haskell) (haskell-indent-cycle))+ ((eq agda2-indentation 'eri) (eri-indent))))++(defun agda2-indent-reverse ()+ "This is what happens when S-TAB is pressed.+Depends on the setting of `agda2-indentation'."+ (interactive)+ (cond ((eq agda2-indentation 'eri) (eri-indent-reverse))))++(defun agda2-indent-setup ()+ "Set up and start the indentation subsystem.+Depends on the setting of `agda2-indentation'."+ (interactive)+ (cond ((eq agda2-indentation 'haskell)+ (labels ((setl (var val) (set (make-local-variable var) val)))+ (setl 'indent-line-function 'haskell-indent-cycle)+ (setl 'haskell-indent-off-side-keywords-re+ "\\<\\(do\\|let\\|of\\|where\\|sig\\|struct\\)\\>[ \t]*"))+ (local-set-key "\177" 'backward-delete-char-untabify)+ (set (make-local-variable 'haskell-literate)+ (if (string-match "\\.lagda$" (buffer-file-name))+ 'latex))+ (setq haskell-indent-mode t)+ (run-hooks 'haskell-indent-hook))))++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+;; Comments and paragraphs++(defun agda2-comments-and-paragraphs-setup nil+ "Set up comment and paragraph handling for Agda mode."++ ;; Syntax table setup for comments is done elsewhere.++ ;; Enable highlighting of comments via Font Lock mode (which uses+ ;; the syntax table).+ (set (make-local-variable 'font-lock-defaults)+ '(nil nil nil nil nil))++ ;; Empty lines (all white space according to Emacs) delimit+ ;; paragraphs.+ (set (make-local-variable 'paragraph-start) "\\s-*$")+ (set (make-local-variable 'paragraph-separate) paragraph-start)++ ;; Support for adding/removing comments.+ (set (make-local-variable 'comment-padding) " ")+ (set (make-local-variable 'comment-start) "--")++ ;; Support for proper filling of text in comments (requires that+ ;; Filladapt is activated).+ (when (featurep 'filladapt)+ (add-to-list (make-local-variable+ 'filladapt-token-table)+ '("--" agda2-comment))+ (add-to-list (make-local-variable 'filladapt-token-match-table)+ '(agda2-comment agda2-comment) t)+ (add-to-list (make-local-variable 'filladapt-token-conversion-table)+ '(agda2-comment . exact))))++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+;; Go to definition site++(defun agda2-goto-definition-keyboard (&optional other-window)+ "Go to the definition site of the name under point (if any).+If this function is invoked with a prefix argument then another window is used+to display the given position."+ (interactive "P")+ (annotation-goto-indirect (point) other-window))++(defun agda2-goto-definition-mouse (ev prefix)+ "Go to the definition site of the name clicked on, if any.+Otherwise, yank (see `mouse-yank-at-click')."+ (interactive "e\nP")+ (let ((pos (posn-point (event-end ev))))+ (if (annotation-goto-possible pos)+ (annotation-goto-indirect pos)+ ;; FIXME: Shouldn't we use something like+ ;; (call-interactively (key-binding ev))? --Stef+ (mouse-yank-at-click ev prefix))))++(defun agda2-go-back nil+ "Go back to the previous position in which+`agda2-goto-definition-keyboard' or `agda2-goto-definition-mouse' was+invoked."+ (interactive)+ (annotation-go-back))++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+;; Implicit arguments++(defun agda2-display-implicit-arguments (&optional arg)+ "Toggle display of implicit arguments.+With prefix argument, turn on display of implicit arguments if+the argument is a positive number, otherwise turn it off."+ (interactive "P")+ (cond ((eq arg nil) (agda2-go "toggleImplicitArgs"))+ ((and (numberp arg)+ (> arg 0)) (agda2-go "showImplicitArgs" "True"))+ (t (agda2-go "showImplicitArgs" "False"))))++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+;;;;++(defun agda2-popup-menu-3 (ev)+ "If in a goal, popup the goal menu and call chosen command."+ (interactive "e")+ (let (choice)+ (save-excursion+ (and (agda2-goal-at (goto-char (posn-point (event-end ev))))+ (setq choice (x-popup-menu ev agda2-goal-map))+ (call-interactively+ (lookup-key agda2-goal-map (apply 'vector choice)))))))++(provide 'agda2-mode)+;;; agda2-mode.el ends here
+ src/data/emacs-mode/agda2.el view
@@ -0,0 +1,13 @@+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+;; Agda mode code which should run before the first Agda file is+;; loaded++(add-to-list 'load-path+ (or (file-name-directory load-file-name) (car load-path)))++(autoload 'agda2-mode "agda2-mode"+ "Major mode for editing Agda files (version ≥ 2)." t)+(add-to-list 'auto-mode-alist '("\\.l?agda\\'" . agda2-mode))+(modify-coding-system-alist 'file "\\.l?agda\\'" 'utf-8)++(provide 'agda2)
+ src/data/emacs-mode/annotation.el view
@@ -0,0 +1,182 @@+;;; annotation.el --- Functions for annotating text with faces and help bubbles++;;; Commentary:+;; ++;;; Code:+(require 'cl)++(defconst annotations-offset (- (save-restriction (widen) (point-min)) 1)+ "Offset between buffer positions and annotations's positions.+Annotations's positions are based on 1, so this adjusts it to the base+position used by your Emacs.")++(defvar annotation-bindings nil+ "An association list mapping symbols to faces.")+(make-variable-buffer-local 'annotation-bindings)++(defvar annotation-goto-stack nil+ "Positions from which `annotation-goto' was invoked.")++(defun annotation-goto-possible (pos)+ "Return t if there's a hyperlink at the buffer position POS, and nil otherwise."+ (if (get-text-property pos 'annotation-goto) t))++(defun annotation-goto-indirect (pos &optional other-window)+ "Follow the `annotation-goto' hyperlink at position POS, if any.+If OTHER-WINDOW is t, use another window to display the given position."+ (let ((previous-file-name buffer-file-name))+ (if (and (annotation-goto (get-text-property pos 'annotation-goto)+ other-window)+ (not (eq (point) pos)))+ (push `(,previous-file-name . ,pos) annotation-goto-stack))))++(defun annotation-go-back nil+ "Go back to the previous position in which `annotation-goto' was+successfully invoked."+ (when annotation-goto-stack+ (let ((pos (pop annotation-goto-stack)))+ (annotation-goto pos))))++(defun annotation-goto (filepos &optional other-window)+ "Go to file position FILEPOS if the file is readable.+FILEPOS should have the form (FILE . POS). Return t if successful.++If OTHER-WINDOW is t, use another window to display the given+position."+ (when (consp filepos)+ (let ((file (car filepos)))+ (if (file-readable-p file)+ (progn+ (if other-window+ (find-file-other-window file)+ (find-file file))+ (goto-char (+ (cdr filepos) annotations-offset))+ t)+ (error "File does not exist or is unreadable: %s." file)))))++(defun annotation-annotate (start end anns &optional info goto)+ "Annotate text between START and END in the current buffer.+ANNS are the annotations to apply. All the symbols in ANNS are+looked up in `annotation-bindings', and the font-lock-face text+property for the given character range is set to the resulting+list of faces. If the string INFO is non-nil, the mouse-face+property is set to highlight, and INFO is used as the help-echo+string. If GOTO has the form (FILENAME . POSITION), then the+mouse-face property is set to highlight and, when the user clicks+on the annotated text, then point is warped to the given position+in the given file.++Note that if two faces have the same attribute set, then the first one+takes precedence.++All characters whose text properties get set also have the+annotation-annotated property set to t, and+annotation-annotations is set to a list with all the properties+that have been set; this ensures that the text properties can+later be removed (if the annotation-* properties are not tampered+with).++Note finally that nothing happens if either START or END are out of+bounds for the current (possibly narrowed) buffer, or END < START."+ (incf start annotations-offset)+ (incf end annotations-offset)+ (when (and (<= (point-min) start)+ (<= start end)+ (<= end (point-max)))+ (let ((faces (delq nil+ (mapcar (lambda (ann)+ (cdr (assoc ann annotation-bindings)))+ anns)))+ (props nil))+ (when faces+ (put-text-property start end 'font-lock-face faces)+ (add-to-list 'props 'font-lock-face))+ ;; Do this before so `info' can override our default help-echo.+ (when (consp goto)+ (add-text-properties start end+ `(annotation-goto ,goto+ mouse-face highlight+ help-echo "Click mouse-2 to jump to definition"))+ (add-to-list 'props 'annotation-goto)+ (add-to-list 'props 'mouse-face)+ (add-to-list 'props 'help-echo))+ (when info+ (add-text-properties start end+ `(mouse-face highlight help-echo ,info))+ (add-to-list 'props 'mouse-face)+ (add-to-list 'props 'help-echo))+ (when props+ (add-text-properties start end+ `(annotation-annotated t+ annotation-annotations ,props))))))++(defmacro annotation-preserve-mod-p-and-undo (&rest code)+ "Run CODE preserving both the undo data and the modification bit."+ (let ((modp (make-symbol "modp")))+ `(let ((,modp (buffer-modified-p))+ (buffer-undo-list t))+ (unwind-protect+ (progn ,@code)+ ;; FIXME: `restore-buffer-modified-p' would be more efficient.+ (set-buffer-modified-p ,modp)))))++(defun annotation-remove-annotations ()+ "Remove all text properties set by `annotation-annotate' in the current buffer.+This function preserves the file modification stamp of the current buffer+and does not modify the undo list.++Note: This function may fail if there is read-only text in the buffer."++ ;; remove-text-properties fails for read-only text.++ (annotation-preserve-mod-p-and-undo+ (let ((pos (point-min))+ pos2)+ (while pos+ (setq pos2 (next-single-property-change pos 'annotation-annotated))+ (let ((props (get-text-property pos 'annotation-annotations)))+ (when props+ (remove-text-properties pos (or pos2 (point-max))+ (mapcan (lambda (prop) (list prop nil))+ (append '(annotation-annotated annotation-annotations)+ props)))))+ (setq pos pos2)))))++(defun annotation-load-file (file removep)+ "Apply the annotations in FILE.+If (`funcall' REMOVEP anns) is non-nil, then all existing text+properties set by `annotation-annotate' in the current buffer are+first removed. Here anns is a list containing all the+annotations (third argument to `annotation-annotate') to be+applied (in some order, with duplicates removed).++FILE should contain calls to `annotation-annotate'. The arguments+to `annotation-annotate' should be in normal form, they are not+evaluated.++This function preserves the file modification stamp of the+current buffer and does not modify the undo list.++Note: This function may fail if there is read-only text in the buffer."+ (annotation-preserve-mod-p-and-undo+ (when (file-readable-p file)+ (let* ((cmds (with-temp-buffer+ (insert "(\n)") (forward-char -2)+ (insert-file-contents file)+ (goto-char (point-min))+ (read (current-buffer))))+ (anns (delete-dups+ (apply 'append (mapcar (lambda (x) (nth 1 (nth 3 x)))+ cmds)))))+ (if (funcall removep anns)+ (annotation-remove-annotations))+ (dolist (cmd cmds)+ (destructuring-bind (f start end anns &optional info goto) cmd+ (assert (eq f 'annotation-annotate))+ (setq anns (cadr anns)) ;Strip the `quote'.+ (setq goto (cadr goto)) ;Strip the `quote'.+ (annotation-annotate start end anns info goto)))))))++(provide 'annotation)+;;; annotation.el ends here
+ src/data/emacs-mode/eri.el view
@@ -0,0 +1,186 @@+;;; eri.el --- Enhanced relative indentation (eri)++;;; Commentary:++;;; Code:++(require 'cl)++(defun eri-current-line-length nil+ "Calculates length of current line."+ (- (line-end-position) (line-beginning-position)))++(defun eri-current-line-empty nil+ "Return non-nil if the current line is empty (not counting white space)."+ (equal (current-indentation)+ (eri-current-line-length)))++(defun eri-maximum (xs)+ "Calculate maximum element in XS. Return nil if the list is empty."+ (if xs (apply 'max xs)))++(defun eri-take (n xs)+ "Return the first N elements of XS."+ (butlast xs (- (length xs) n)))++(defun eri-split (x xs)+ "Return a pair of lists (XS1 . XS2).+If XS is sorted, then XS = (append XS1 XS2), and all elements in XS1 are <= X,+whereas all elements in XS2 are > X."+ (let* ((pos (or (position-if (lambda (y) (> y x)) xs) (length xs)))+ (xs1 (eri-take pos xs))+ (xs2 (nthcdr pos xs)))+ `(,xs1 . ,xs2)))++(defun eri-calculate-indentation-points-on-line (max)+ "Calculate indentation points on current line.+Only points left of column number MAX are included.+If MAX is nil, then all points are included. Return points in ascending order.++Example (positions marked with ^ are returned):++ f x y = g 3 (Just y) 5 4+ ^ ^ ^ ^ ^ ^ ^ ^ |+ |+ MAX"+ (let ((result))+ (save-restriction+ (beginning-of-line)+ ; To make \\` work in the regexp below:+ (narrow-to-region (line-beginning-position) (line-end-position))+ (while+ (progn+ (let ((pos (and (search-forward-regexp+ "\\(?:\\s-\\|\\`\\)\\(\\S-\\)" nil t)+ (match-beginning 1))))+ (when (not (null pos))+ (let ((pos1 (- pos (line-beginning-position))))+ (when (or (null max) (< pos1 max))+ (add-to-list 'result pos1))))+ (and pos+ (< (point) (line-end-position))+ (or (null max) (< (current-column) max))))))+ (nreverse result) ; Destructive operation.+ )))++(defun eri-new-indentation-point ()+ "Calculate a new indentation point, two steps in from the+indentation of the first non-empty line above the current line.+If there is no such line 2 is returned."+ (save-excursion+ (while+ (progn+ (forward-line -1)+ (not (or (bobp)+ (not (eri-current-line-empty))))))+ (+ 2 (current-indentation))))++(defun eri-calculate-indentation-points (reverse)+ "Calculate some indentation points. Gives them in reverse order if+REVERSE is non-nil. See `eri-indent' for a description of how+the indentation points are calculated."+ ;; First find a bunch of indentations used above the current line.+ (let ((points)+ (max))+ (save-excursion+ (while+ (progn+ (forward-line -1)+ ; Skip lines with only white space.+ (unless (eri-current-line-empty)+ (setq points+ (append+ (eri-calculate-indentation-points-on-line max)+ points))+ (setq max (car points)))+ ;; Stop after hitting the beginning of the buffer or a+ ;; non-empty, non-indented line.+ (not (or (bobp)+ (and (equal (current-indentation) 0)+ (> (eri-current-line-length) 0)))))))+ ;; Add a new indentation point. Sort the indentations.+ ;; Rearrange the points so that the next point is the one after the+ ;; current one.+ (let* ((ps (add-to-list 'points (eri-new-indentation-point)))+ (ps1 (sort ps '<)) ; Note: sort is destructive.+ (ps2 (eri-split (current-indentation)+ (remove (current-indentation) ps1))))+ (if reverse+ (append (nreverse (car ps2)) (nreverse (cdr ps2)))+ (append (cdr ps2) (car ps2))))))++(defun eri-indent (&optional reverse)+ "Cycle between some possible indentation points.+With prefix argument REVERSE, cycle in reverse order.++Assume that a file contains the following lines of code, with point on+the line with three dots:++frob = loooooooooooooooooooooooooong identifier+foo = f a b+ where+ f (Foo x) y = let bar = x+ baz = 3 + 5++...++^ ^ ^ ^ ^ ^ ^ ^ ^ * ^ ^ ^ ^++Then the ^'s and the * mark the indentation points that this function+cycles through. The indentation points are selected as follows:++ * All lines before the current one, up to and including the first+ non-indented line (or the beginning of the buffer) are considered.++ foo = f a b+ where+ f (Foo x) y = let bar = x+ baz = 3 + 5++ * On these lines, erase all characters that stand to the right of+ some non-white space character on a lower line.++ foo+ whe+ f (Foo x) y = let b+ baz = 3 + 5++ * Also erase all characters not immediately preceded by white+ space.++ f+ w+ f ( x y = l b+ b = 3 + 5++ * The columns of all remaining characters are indentation points.++ f w f ( x y = l b = 3 + 5+ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^++ * A new indentation point is also added, two steps in from the+ indentation of the first non-empty line above the current line+ (or in the second column, if there is no such line).++ f w f ( x y = l b = 3 + 5+ ^ ^ ^ ^ ^ ^ ^ ^ ^ * ^ ^ ^ ^"+ (interactive "P")+ (let* ((points (eri-calculate-indentation-points reverse))+ (remaining-points (cdr (member (current-indentation) points)))+ (indentation (if remaining-points+ (car remaining-points)+ (car points))))+ (when indentation+ (save-excursion (indent-line-to indentation))+ (if (< (current-column) indentation)+ (indent-line-to indentation)))))++(defun eri-indent-reverse nil+ "Cycle between some possible indentation points (in reverse order).+See `eri-indent' for a description of how the indentation points are+calculated."+ (interactive)+ (eri-indent t))++(provide 'eri)+;;; eri.el ends here
src/full/Agda/Compiler/Agate/Classify.hs view
@@ -72,10 +72,10 @@ Record{} -> return True where -- TODO: implement correctly -- isCompilableType (El s tm) = isCompilableTypeFamily tm- + isCompilableType :: Type -> TCM Bool isCompilableType (El s tm) = isCompilableTypeFamily tm- + isCompilableTypeFamily :: Term -> TCM Bool isCompilableTypeFamily tm = do tm <- reduce tm@@ -126,7 +126,7 @@ go2 [] namesNext grantedNames changed = go namesNext grantedNames changed go2 (name:names) namesNext grantedNames changed = do- b <- f grantedNames name + b <- f grantedNames name case b of True -> go2 names namesNext (name : grantedNames) True -- name is granted to be okay@@ -134,4 +134,4 @@ -- name is unsettled --- +
src/full/Agda/Compiler/Agate/OptimizedPrinter.hs view
@@ -169,7 +169,7 @@ let dvars = map (\i -> text ("v" ++ show i)) [1 .. np + ni] let dvaluedef = sep [ sep (dname : dvars), equals ] <+> text "()" return $ dtypedecl $+$ dvaluedef- Record{} -> + Record{} -> return empty -- no o_xxx since we always use D_xxx Constructor{} -> return empty -- no o_xxx since we always use D_xxx@@ -183,7 +183,7 @@ fTerm = showAsOptimizedTerm fCon name dargs = do dname <- showAsOptimizedConstructor name- return $ parens $ sep (dname : dargs) + return $ parens $ sep (dname : dargs) fBody dpats term = do dterm <- showAsOptimizedTerm term return $ (sep (dfuncname : dpats) <+> equals) <+> nest 2 dterm@@ -192,7 +192,7 @@ -- implementation of the "K" function class ShowAsOptimizedKind a where- showAsOptimizedKind :: a -> TCM Doc + showAsOptimizedKind :: a -> TCM Doc instance ShowAsOptimizedKind Type where showAsOptimizedKind (El s t) = showAsOptimizedKind t@@ -221,7 +221,7 @@ -- implementation of the "T" function class ShowAsOptimizedType a where- showAsOptimizedType :: a -> TCM Doc + showAsOptimizedType :: a -> TCM Doc instance ShowAsOptimizedType QName where showAsOptimizedType s = return $ text $ translateNameAsOptimizedType $ show s@@ -269,7 +269,7 @@ -- implementation of the "O" function class ShowAsOptimizedTerm a where- showAsOptimizedTerm :: a -> TCM Doc + showAsOptimizedTerm :: a -> TCM Doc instance ShowAsOptimizedTerm Name where showAsOptimizedTerm s = return $ text $ translateNameAsOptimizedTerm $ show s
src/full/Agda/Compiler/Agate/TranslateName.hs view
@@ -50,4 +50,4 @@ :intToDigit (ord c `mod` 16):escape s ----------------------------------------------------------------- +
src/full/Agda/Compiler/Agate/UntypedPrinter.hs view
@@ -31,7 +31,7 @@ -- implementation of the "X" function class ShowAsUntypedTerm a where- showAsUntypedTerm :: a -> TCM Doc + showAsUntypedTerm :: a -> TCM Doc instance ShowAsUntypedTerm Name where showAsUntypedTerm t = return $ text $ translateNameAsUntypedTerm $ show t
src/full/Agda/Compiler/Alonzo/Haskell.hs view
@@ -10,7 +10,7 @@ hsModule name decls = HsModule dummyLoc (Module name) Nothing [] decls hsModuleImporting :: String -> [String] -> [String] -> [HsDecl] -> HsModule-hsModuleImporting name imps qimps decls = +hsModuleImporting name imps qimps decls = HsModule dummyLoc (Module name) Nothing (map hsImport imps ++ impRTS : impRTP : map hsQImport qimps) decls @@ -39,13 +39,13 @@ hsVar :: String -> HsExp hsVar s = HsVar $ UnQual $ HsIdent s -hsCon :: String -> HsExp +hsCon :: String -> HsExp hsCon s = HsCon $ UnQual $ HsIdent s hsLam :: String -> HsExp -> HsExp hsLam n e = HsLambda dummyLoc [HsPVar (HsIdent n)] e -hsAp :: HsExp -> HsExp -> HsExp +hsAp :: HsExp -> HsExp -> HsExp hsAp e1 e2 = HsApp (hsCast e1) $ HsParen (hsCast e2) outputHsModule s hsmod numOfMainS = do
src/full/Agda/Compiler/Alonzo/Main.hs view
@@ -64,7 +64,7 @@ withCurrentModule moduleName $ do -- TODO: Hack! builtinMap <- getBuiltinThings -- let sigs = toList sig- -- let definitions = mdefDefs (snd (head sigs)) -- :: Map Name Definition + -- let definitions = mdefDefs (snd (head sigs)) -- :: Map Name Definition let definitions = sigDefinitions sig -- :: Map QName Definition let defs = Map.toList definitions let names = List.map fst defs@@ -121,8 +121,8 @@ -- isMain (Name _ (C.Name _ [C.Id _ "mainS"]) _ _ ) = True isMain n = (show n == "main") - + processDefWithDebug :: (QName,Definition) -> TCM [HsDecl] processDefWithDebug (qname,def) = do def <- instantiateFull def@@ -131,10 +131,10 @@ nameInfo = infoDecl infoName (show name) infoName = "name" ++ (show $ numOfName name) name = qnameName qname- + infoDecl :: String -> String -> HsDecl infoDecl name val = HsFunBind [ HsMatch dummyLoc hsname [] rhs []] where- rhs = HsUnGuardedRhs $ HsLit $ HsString val + rhs = HsUnGuardedRhs $ HsLit $ HsString val hsname = HsIdent name @@ -144,7 +144,7 @@ return [HsFunBind [HsMatch dummyLoc (dfName name) [] rhs hsDecls]] where rhs = HsUnGuardedRhs $ HsVar $ UnQual $ dfNameSub name 1 name = qnameName qname- + processDef (qname,Defn { theDef = Datatype{ dataPars = n, dataClause = Nothing, dataCons = [] } }) = do return [ddecl,vdecl] where name = qnameName qname@@ -189,7 +189,7 @@ hsname = dfName name nDummyArgs 0 = [] nDummyArgs k = (HsPVar $ HsIdent ("v" ++ (show k))) : nDummyArgs (k-1)- + processDef def@(qname,Defn { theDef = Constructor{} }) = return [] @@ -211,7 +211,7 @@ name = qnameName qname processDef (qname, (Defn { theDef = Datatype{dataClause = Just clause} })) = do- -- liftIO $ putStrLn $ gshow $ clauseBod clause + -- liftIO $ putStrLn $ gshow $ clauseBod clause mkSynonym (clauseBod clause) where name = qnameName qname mkSynonym (Lam _ (Abs _ t)) = mkSynonym t@@ -229,7 +229,7 @@ typ = HsTyCon $ Qual hsModuleName $ dataName $ qnameName rhsqname mkSynonym t = __IMPOSSIBLE__ {- do- liftIO $ putStrLn $ gshow t + liftIO $ putStrLn $ gshow t return [] -} @@ -240,12 +240,12 @@ mkSynonym (Lam _ (Abs _ t)) = mkSynonym t mkSynonym (Def newqn args) = return [ddecl, vdecl] where ddecl = HsTypeDecl loc dname [] typ- + loc = dummyLoc dname = dataName name typ = HsTyCon $ UnQual $ dataName $ qnameName newqn mkSynonym t = do- liftIO $ putStrLn $ gshow t + liftIO $ putStrLn $ gshow t return [] -} @@ -301,12 +301,12 @@ (exp, pst) <- runStateT bodyPM pst0 let rhs = HsUnGuardedRhs exp (pats, pst2) <- runStateT (processArgPats args) pst- return $ HsFunBind $ [HsMatch dummyLoc hsid pats rhs decls] + return $ HsFunBind $ [HsMatch dummyLoc hsid pats rhs decls] where decls = [] hsid = dfNameSub name $ fromIntegral number- -- pats = processArgPats args - + -- pats = processArgPats args+ contClause :: Name -> Nat -> Clause -> TCM HsDecl contClause name number (Clause{ clausePats = args, clauseBody = body }) = do return $ HsFunBind $ [HsMatch dummyLoc hsid pats rhs decls] where@@ -340,7 +340,7 @@ processPat (VarP _) = do pats <- getPlst case pats of- [] -> do + [] -> do c <- getPclause error $ "Oops! empty pattern list in\n" ++ (gshow c) (p:ps) -> do@@ -363,16 +363,16 @@ return $ HsPParen $ HsPApp cname hspats processPat (LitP (LitInt _ i)) = return $ HsPLit (HsInt i)-processPat (LitP (LitChar _ c)) = +processPat (LitP (LitChar _ c)) = return $ HsPParen $ HsPApp (rtpCon "CharT") [HsPLit (HsChar c)]-processPat (LitP _) = error "Unimplemented literal patttern" +processPat (LitP _) = error "Unimplemented literal patttern" -- processPat (AbsurdP _) = return HsPWildCard - + processBody :: ClauseBody -> PM HsExp-processBody (NoBind cb) = do +processBody (NoBind cb) = do addWildcard- processBody cb + processBody cb processBody (Bind (Abs name cb)) = do -- cnt <- getPcnt addVar@@ -404,8 +404,8 @@ -- Can be a record constructor in which case the def will be for the record. _ -> do ldefs <- getPDefs- if (Map.member qn ldefs) - then do + if (Map.member qn ldefs)+ then do definiens <- case theDef <$> Map.lookup qn ldefs of Just df -> return df Nothing -> fail $ "Alonzo: No such definition: " ++ show qn@@ -437,7 +437,7 @@ processLit (LitInt _ i) = HsApp toNat $ intLit i where intLit i = HsParen $ hsPreludeTypedExp "Integer" $ HsLit $ HsInt i toNat = HsVar $ Qual (Module "RTP") $ HsIdent "_primIntegerToNat"-processLit (LitFloat _ f) = hsPreludeTypedExp "Double" $ +processLit (LitFloat _ f) = hsPreludeTypedExp "Double" $ HsLit $ HsFrac $ toRational f -- processLit (LitFloat _ f) = HsApp (HsVar $ rtpCon "FloatT") -- (HsLit $ HsFrac $ toRational f)@@ -455,7 +455,7 @@ unfoldVap p e ((Arg NotHidden t):ts) = do e1 <- evalStateT (processTerm t) p unfoldVap p (hsAp e e1) ts--- unfoldVap p e ((Arg Hidden t):ts) = unfoldVap p e ts +-- unfoldVap p e ((Arg Hidden t):ts) = unfoldVap p e ts unfoldVap p e ((Arg Hidden t):ts) = do e1 <- evalStateT (processTerm t) p unfoldVap p (hsAp e e1) ts@@ -475,7 +475,7 @@ getConArity :: QName -> TCM Nat getConArity qn = do- Defn _ ty _ _ Constructor{conPars = np} <- getConstInfo qn + Defn _ ty _ _ Constructor{conPars = np} <- getConstInfo qn ty' <- normalise ty return $ typeArity ty' - np -- return $ arity ty'
src/full/Agda/Compiler/Alonzo/Names.hs view
@@ -41,7 +41,7 @@ id = (dfStr name) ++ "_" ++ (show i) dfQName :: QName -> HsQName-dfQName (QName m n) +dfQName (QName m n) | (moduleStr m) == "RTP" = Qual (Module $ moduleStr m)(HsIdent $ "_"++(show n)) | otherwise = Qual (Module $ moduleStr m) (dfName n)
src/full/Agda/Compiler/Alonzo/PatternMonad.hs view
@@ -14,7 +14,7 @@ import Agda.Utils.Size type Defs = Map QName Definition-data PState = PSt +data PState = PSt { cnt :: Int , vars :: [Int] , lst :: [HsPat]@@ -23,11 +23,11 @@ } initPState :: Clause -> Defs -> PState-initPState c@(Clause{ clausePerm = perm }) d = PSt +initPState c@(Clause{ clausePerm = perm }) d = PSt { cnt = 0 , vars = permute perm [0..] , lst = []- , clause = c + , clause = c , defs = d } @@ -55,7 +55,7 @@ incPcnt = modify $ \s -> s { cnt = 1 + cnt s } addWildcard :: PM()-addWildcard = do +addWildcard = do lst <- getPlst putPlst $ lst++[HsPWildCard]
src/full/Agda/Compiler/MAlonzo/Compiler.hs view
@@ -101,7 +101,7 @@ Constructor{} -> return [] Record{ recClause = cl, recFields = flds } -> do ar <- arity <$> normalise ty- return $ tvaldecl q (genericLength flds) ar [cdecl q (genericLength flds)] cl + return $ tvaldecl q (genericLength flds) ar [cdecl q (genericLength flds)] cl Primitive{ primName = s } -> fb <$> primBody s where tag _ [] = []@@ -204,12 +204,12 @@ LitFloat _ _ -> return $ typed "Double" _ -> return $ l' where l' = HsLit $ hslit l- typed = HsExpTypeSig dummy l' . HsQualType [] . HsTyCon . rtmQual + typed = HsExpTypeSig dummy l' . HsQualType [] . HsTyCon . rtmQual hslit :: Literal -> HsLiteral hslit l = case l of LitInt _ x -> HsInt x LitFloat _ x -> HsFrac (toRational x)- LitString _ x -> HsString x + LitString _ x -> HsString x LitChar _ x -> HsChar x condecl :: QName -> TCM (Nat, HsConDecl)@@ -280,7 +280,7 @@ outFile :: TCM FilePath outFile = snd <$> outFile'- + callGHC :: (Interface, ClockTime) -> TCM () callGHC mainICT = do setInterface mainICT
src/full/Agda/Compiler/MAlonzo/Misc.hs view
@@ -124,7 +124,7 @@ -- qualify name s by the module of builtin b bltQual :: String -> String -> TCM HsQName-bltQual b s = do (Def q _) <- getBuiltin b; xqual q (HsIdent s) +bltQual b s = do (Def q _) <- getBuiltin b; xqual q (HsIdent s) -- sub-naming for cascaded definitions for concsecutive clauses dsubname q i | i == 0 = unqhname "d" q@@ -149,7 +149,7 @@ rtmMod = mazMod' "Runtime" rtmQual = UnQual . HsIdent rtmVar = HsVar . rtmQual-rtmError s = rtmVar "error" `HsApp` +rtmError s = rtmVar "error" `HsApp` (HsLit $ HsString $ "MAlonzo Runtime Error: " ++ s) unsafeCoerceMod = Module "Unsafe.Coerce"@@ -176,7 +176,7 @@ dummy :: a dummy = error "MAlonzo : this dummy value should not have been eval'ed."- + -------------------------------------------------- -- For Debugging
src/full/Agda/Compiler/MAlonzo/Primitives.hs view
@@ -76,12 +76,12 @@ ," | True = <<1>> (unsafeCoerce (f (x - 1)))" ,"} in f"]) in decls ["ZERO", "SUC"] to totxt from fromtxt - decls cs n1 b1 n2 b2 = + decls cs n1 b1 n2 b2 = ifM (hasCompiledData cs) (return $ L.map (`fakeDS` "id") [n1, n2]) $ do cs' <- mapM pconName cs return $ zipWith (\ n -> fakeDS n . repl cs') [n1, n2] [b1, b2] - + mazNatToInteger = "mazNatToInteger" mazIntegerToNat = "mazIntegerToNat" mazNatToInt = "mazNatToInt" @@ -106,7 +106,7 @@ -- Definition bodies for primitive functions primBody :: String -> TCM HsExp -primBody s = (hsVarUQ . HsIdent <$>) $ maybe unimplemented id $ L.lookup s $ +primBody s = (hsVarUQ . HsIdent <$>) $ maybe unimplemented id $ L.lookup s $ [ -- Integer functions "primIntegerPlus" |-> binAsis "(+)" "Integer" @@ -187,7 +187,7 @@ return $ repl [op, ty, toHB, toTy] $ "(\\ x y -> <<2>> ((<<0>> :: <<1>> -> <<1>> -> Bool) (<<3>> x) (<<3>> y)))" relNat op = do toHI <- bltQual' "NATURAL" mazNatToInteger - rel' toHI op "Integer" + rel' toHI op "Integer" rel op ty = rel' "" op ty pred p = do toHB <- bltQual' "BOOL" mazHBoolToBool return $ repl [p, toHB] $ "(\\ x -> <<1>> (<<0>> x))" @@ -217,7 +217,7 @@ toB (Lam _ (Abs _ t)) = toB t toB _ = return False hasCompiledData _ = return False - + bltQual' b s = prettyPrint <$> bltQual b s
src/full/Agda/Interaction/BasicOps.hs view
@@ -3,7 +3,7 @@ #-} module Agda.Interaction.BasicOps where-{- TODO: The operations in this module should return Expr and not String, +{- TODO: The operations in this module should return Expr and not String, for this we need to write a translator from Internal to Abstract syntax. -} @@ -15,11 +15,11 @@ import Data.List import Data.Maybe -import Agda.Interaction.Monad +import Agda.Interaction.Monad import qualified Agda.Syntax.Concrete as C -- ToDo: Remove with instance of ToConcrete import Agda.Syntax.Position-import Agda.Syntax.Abstract +import Agda.Syntax.Abstract import Agda.Syntax.Common import Agda.Syntax.Info(ExprInfo(..),MetaInfo(..)) import Agda.Syntax.Internal (MetaId(..),Type(..),Term(..),Sort(..))@@ -47,7 +47,7 @@ parseExprIn :: InteractionId -> Range -> String -> TCM Expr parseExprIn ii rng s = do mId <- lookupInteractionId ii- updateMetaVarRange mId rng + updateMetaVarRange mId rng mi <- getMetaInfo <$> lookupMeta mId let pos = case rStart (getRange mi) of Just pos -> pos@@ -58,12 +58,12 @@ giveExpr :: MetaId -> Expr -> TCM Expr -- When translater from internal to abstract is given, this function might return -- the expression returned by the type checker.-giveExpr mi e = - do mv <- lookupMeta mi +giveExpr mi e =+ do mv <- lookupMeta mi withMetaInfo (getMetaInfo mv) $ metaTypeCheck' mi e mv- - where metaTypeCheck' mi e mv = - case mvJudgement mv of ++ where metaTypeCheck' mi e mv =+ case mvJudgement mv of HasType _ t -> do ctx <- getContextArgs let t' = t `piApply` ctx@@ -76,42 +76,42 @@ IsSort _ -> __IMPOSSIBLE__ give :: InteractionId -> Maybe Range -> Expr -> TCM (Expr,[InteractionId])-give ii mr e = liftTCM $ +give ii mr e = liftTCM $ do setUndo- mi <- lookupInteractionId ii + mi <- lookupInteractionId ii mis <- getInteractionPoints r <- getInteractionRange ii updateMetaVarRange mi $ maybe r id mr giveExpr mi e- removeInteractionPoint ii + removeInteractionPoint ii mis' <- getInteractionPoints- return (e, mis' \\ mis) + return (e, mis' \\ mis) addDecl :: Declaration -> TCM ([InteractionId])-addDecl d = +addDecl d = do setUndo mis <- getInteractionPoints checkDecl d mis' <- getInteractionPoints- return (mis' \\ mis) + return (mis' \\ mis) refine :: InteractionId -> Maybe Range -> Expr -> TCM (Expr,[InteractionId])--- If constants has a fixed arity, then it might be better to do +-- If constants has a fixed arity, then it might be better to do -- exact refinement.-refine ii mr e = +refine ii mr e = do mi <- lookupInteractionId ii- mv <- lookupMeta mi + mv <- lookupMeta mi let range = maybe (getRange mv) id mr- let scope = M.getMetaScope mv + let scope = M.getMetaScope mv tryRefine 10 range scope e where tryRefine :: Int -> Range -> ScopeInfo -> Expr -> TCM (Expr,[InteractionId]) tryRefine nrOfMetas r scope e = try nrOfMetas e where try 0 e = throwError (strMsg "Can not refine") try n e = give ii (Just r) e `catchError` (\_ -> try (n-1) (appMeta e)) appMeta :: Expr -> Expr- appMeta e = + appMeta e = let metaVar = QuestionMark $ Agda.Syntax.Info.MetaInfo { Agda.Syntax.Info.metaRange = r@@ -124,24 +124,24 @@ {- refineExact :: InteractionId -> Maybe Range -> Expr -> TCM (Expr,[InteractionId])-refineExact ii mr e = +refineExact ii mr e = do mi <- lookupInteractionId ii- mv <- lookupMeta mi + mv <- lookupMeta mi let range = maybe (getRange mv) id mr let scope = M.getMetaScope mv- (_,t) <- withMetaInfo (getMetaInfo mv) $ inferExpr e + (_,t) <- withMetaInfo (getMetaInfo mv) $ inferExpr e let arityt = arity t- + tryRefine 10 range scope e where tryRefine :: Int -> Range -> ScopeInfo -> Expr -> TCM (Expr,[InteractionId]) tryRefine nrOfMetas r scope e = try nrOfMetas e where try 0 e = throwError (strMsg "Can not refine") try n e = give ii (Just r) e `catchError` (\_ -> try (n-1) (appMeta e)) appMeta :: Expr -> Expr- appMeta e = + appMeta e = let metaVar = QuestionMark $ Agda.Syntax.Info.MetaInfo {Agda.Syntax.Info.metaRange = r, Agda.Syntax.Info.metaScope = scope}- in App (ExprRange $ r) NotHidden e metaVar + in App (ExprRange $ r) NotHidden e metaVar --ToDo: The position of metaVar is not correct @@ -149,33 +149,33 @@ abstract :: InteractionId -> Maybe Range -> TCM (Expr,[InteractionId])-abstract ii mr +abstract ii mr refineExact :: InteractionId -> Expr -> TCM (Expr,[InteractionId])-refineExact ii e = - do +refineExact ii e =+ do -} {-| Evaluate the given expression in the current environment -} evalInCurrent :: Expr -> TCM Expr-evalInCurrent e = - do t <- newTypeMeta_ +evalInCurrent e =+ do t <- newTypeMeta_ v <- checkExpr e t v' <- normalise v reify v' evalInMeta :: InteractionId -> Expr -> TCM Expr-evalInMeta ii e = +evalInMeta ii e = do m <- lookupInteractionId ii mi <- getMetaInfo <$> lookupMeta m withMetaInfo mi $ evalInCurrent e -data Rewrite = AsIs | Instantiated | HeadNormal | Normalised +data Rewrite = AsIs | Instantiated | HeadNormal | Normalised --rewrite :: Rewrite -> Term -> TCM Term rewrite AsIs t = return t@@ -222,7 +222,7 @@ fmap f (IsEmptyType a) = IsEmptyType a instance Reify Constraint (OutputForm Expr Expr) where- reify (ValueCmp cmp t u v) = CmpInType cmp <$> reify t <*> reify u <*> reify v + reify (ValueCmp cmp t u v) = CmpInType cmp <$> reify t <*> reify u <*> reify v reify (TypeCmp cmp t t') = CmpTypes cmp <$> reify t <*> reify t' reify (SortCmp cmp s s') = CmpSorts cmp <$> reify s <*> reify s' reify (Guarded c cs) = do@@ -259,12 +259,12 @@ show (Assign m e) = show m ++ " := " ++ show e show (IsEmptyType a) = "Is empty: " ++ show a -instance (ToConcrete a c, ToConcrete b d) => +instance (ToConcrete a c, ToConcrete b d) => ToConcrete (OutputForm a b) (OutputForm c d) where toConcrete (OfType e t) = OfType <$> toConcrete e <*> toConcrete t toConcrete (JustType e) = JustType <$> toConcrete e toConcrete (JustSort e) = JustSort <$> toConcrete e- toConcrete (CmpInType cmp t e e') = + toConcrete (CmpInType cmp t e e') = CmpInType cmp <$> toConcrete t <*> toConcrete e <*> toConcrete e' toConcrete (CmpTypes cmp e e') = CmpTypes cmp <$> toConcrete e <*> toConcrete e' toConcrete (CmpSorts cmp e e') = CmpSorts cmp <$> toConcrete e <*> toConcrete e'@@ -295,8 +295,8 @@ --- Printing Operations getConstraint :: Int -> TCM (OutputForm Expr Expr)-getConstraint ci = - do cc <- lookupConstraint ci +getConstraint ci =+ do cc <- lookupConstraint ci cc <- reduce cc withConstraint reify cc @@ -334,7 +334,7 @@ PostponedTypeCheckingProblem{} -> unsol typeOfMetaMI :: Rewrite -> MetaId -> TCM (OutputForm Expr MetaId)-typeOfMetaMI norm mi = +typeOfMetaMI norm mi = do mv <- lookupMeta mi withMetaInfo (getMetaInfo mv) $ rewriteJudg mv (mvJudgement mv)@@ -347,7 +347,7 @@ typeOfMeta :: Rewrite -> InteractionId -> TCM (OutputForm Expr InteractionId)-typeOfMeta norm ii = +typeOfMeta norm ii = do mi <- lookupInteractionId ii out <- typeOfMetaMI norm mi return $ fmap (\_ -> ii) out@@ -356,11 +356,11 @@ typeOfMetas :: Rewrite -> TCM ([OutputForm Expr InteractionId],[OutputForm Expr MetaId]) -- First visible metas, then hidden typeOfMetas norm = liftTCM $- do ips <- getInteractionPoints + do ips <- getInteractionPoints js <- mapM (typeOfMeta norm) ips hidden <- hiddenMetas return $ (js,hidden)- where hiddenMetas = --TODO: Change so that it uses getMetaMI above + where hiddenMetas = --TODO: Change so that it uses getMetaMI above do is <- getInteractionMetas store <- Map.filterWithKey (openAndImplicit is) <$> getMetaStore let mvs = Map.keys store
src/full/Agda/Interaction/CommandLine/CommandLine.hs view
@@ -139,7 +139,7 @@ liftIO $ UTF8.putStrLn $ unlines (List.map show cs) showConstraints _ = liftIO $ UTF8.putStrLn ":constraints [cid]" - + showMetas :: [String] -> TCM () showMetas [m] = do i <- InteractionId <$> readM m@@ -154,8 +154,8 @@ s <- showA =<< typeOfMeta Normalised i r <- getInteractionRange i liftIO $ UTF8.putStrLn $ s ++ " " ++ show r-showMetas [] = - do (interactionMetas,hiddenMetas) <- typeOfMetas AsIs +showMetas [] =+ do (interactionMetas,hiddenMetas) <- typeOfMetas AsIs mapM_ (liftIO . UTF8.putStrLn) =<< mapM showII interactionMetas mapM_ print' hiddenMetas where@@ -180,7 +180,7 @@ liftIO $ UTF8.print scope metaParseExpr :: InteractionId -> String -> TCM A.Expr-metaParseExpr ii s = +metaParseExpr ii s = do m <- lookupInteractionId ii scope <- getMetaScope <$> lookupMeta m r <- getRange <$> lookupMeta m@@ -192,16 +192,16 @@ concreteToAbstract scope e actOnMeta :: [String] -> (InteractionId -> A.Expr -> TCM a) -> TCM a-actOnMeta (is:es) f = +actOnMeta (is:es) f = do i <- readM is- let ii = InteractionId i + let ii = InteractionId i e <- metaParseExpr ii (unwords es) withInteractionId ii $ f ii e actOnMeta _ _ = __IMPOSSIBLE__ giveMeta :: [String] -> TCM ()-giveMeta s | length s >= 2 = +giveMeta s | length s >= 2 = do actOnMeta s (\ii -> \e -> give ii Nothing e) return () giveMeta _ = liftIO $ UTF8.putStrLn $ ": give" ++ " metaid expr"@@ -209,7 +209,7 @@ refineMeta :: [String] -> TCM ()-refineMeta s | length s >= 2 = +refineMeta s | length s >= 2 = do actOnMeta s (\ii -> \e -> refine ii Nothing e) return () refineMeta _ = liftIO $ UTF8.putStrLn $ ": refine" ++ " metaid expr"@@ -240,21 +240,21 @@ return Continue where evalInCurrent e = do- t <- newTypeMeta_ + t <- newTypeMeta_ v <- checkExpr e t v' <- normalise v return v' typeOf :: [String] -> TCM ()-typeOf s = +typeOf s = do e <- parseExpr (unwords s) e0 <- typeInCurrent Normalised e e1 <- typeInCurrent AsIs e liftIO . UTF8.putStrLn =<< showA e1 typeIn :: [String] -> TCM ()-typeIn s@(_:_:_) = +typeIn s@(_:_:_) = actOnMeta s $ \i e -> do e1 <- typeInMeta i Normalised e e2 <- typeInMeta i AsIs e
src/full/Agda/Interaction/Highlighting/HTML.hs view
@@ -46,10 +46,10 @@ generateHTML :: A.ModuleName -> TCM () generateHTML mod = do- options <- TCM.commandLineOptions- case optHTMLDir options of- Nothing -> TCM.typeError TCM.HTMLDirUndefined- Just dir -> do+ options <- TCM.commandLineOptions++ -- There is a default directory given by 'defaultHTMLDir'+ let dir = optHTMLDir options liftIO $ createDirectoryIfMissing True dir -- If the default CSS file should be used, then it is copied to
src/full/Agda/Interaction/Highlighting/Precise.hs view
@@ -82,7 +82,7 @@ data MetaInfo = MetaInfo { aspect :: Maybe Aspect- , otherAspects :: [OtherAspect] + , otherAspects :: [OtherAspect] , note :: Maybe String -- ^ This note, if present, can be displayed as a tool-tip or -- something like that. It should contain useful information about@@ -201,7 +201,7 @@ join pms = ( Range { from = head ps, to = last ps + 1 } , head ms )- where (ps, ms) = unzip pms + where (ps, ms) = unzip pms -- | Decompresses a compressed file.
src/full/Agda/Interaction/Imports.hs view
@@ -23,7 +23,7 @@ import Agda.Syntax.Position import qualified Agda.Syntax.Concrete as C import Agda.Syntax.Abstract.Name-import Agda.Syntax.Parser +import Agda.Syntax.Parser import Agda.Syntax.Scope.Base import Agda.Syntax.Scope.Monad import Agda.Syntax.Translation.ConcreteToAbstract
src/full/Agda/Interaction/Monad.hs view
@@ -30,8 +30,8 @@ instance MonadUndo [CurrentPoint] IM where- undo = - + undo =+ run
src/full/Agda/Interaction/Options.hs view
@@ -58,7 +58,7 @@ , optGenerateVimFile :: Bool , optGenerateEmacsFile :: Bool , optGenerateHTML :: Bool- , optHTMLDir :: Maybe FilePath+ , optHTMLDir :: FilePath , optCSSFile :: Maybe FilePath , optIgnoreInterfaces :: Bool , optDisablePositivity :: Bool@@ -96,7 +96,7 @@ , optGenerateVimFile = False , optGenerateEmacsFile = False , optGenerateHTML = False- , optHTMLDir = Nothing+ , optHTMLDir = defaultHTMLDir , optCSSFile = Nothing , optIgnoreInterfaces = False , optDisablePositivity = False@@ -115,6 +115,10 @@ defaultMAlonzoDir = "." +-- | The default output directory for HTML.++defaultHTMLDir = "html"+ prop_defaultOptions = case checkOpts defaultOptions of Left _ -> False Right _ -> True@@ -148,6 +152,7 @@ , optCompileMAlonzo ] +inputFlag :: FilePath -> CommandLineOptions -> Either String CommandLineOptions inputFlag f o = case optInputFile o of Nothing -> checkOpts $ o { optInputFile = Just f }@@ -180,7 +185,7 @@ ghcFlag f o = checkOpts $ o { optGhcFlags = f : optGhcFlags o } htmlFlag o = checkOpts $ o { optGenerateHTML = True }-htmlDirFlag d o = checkOpts $ o { optHTMLDir = Just d }+htmlDirFlag d o = checkOpts $ o { optHTMLDir = d } cssFlag f o = checkOpts $ o { optCSSFile = Just f } includeFlag d o = checkOpts $ o { optIncludeDirs = d : optIncludeDirs o }@@ -216,7 +221,7 @@ "use the Alonzo compiler (only with --compile)" , Option [] ["malonzo"] (NoArg malonzoFlag) "use the MAlonzo compiler (DEFAULT) (only with --compile)"- , Option [] ["malonzodir"] (ReqArg malonzoDirFlag "DIR")+ , Option [] ["malonzo-dir"] (ReqArg malonzoDirFlag "DIR") ("directory for MAlonzo output (default: " ++ defaultMAlonzoDir ++ ")") , Option [] ["ghc-flag"] (ReqArg ghcFlag "GHC-FLAG")@@ -230,7 +235,8 @@ , Option [] ["html"] (NoArg htmlFlag) "generate HTML files with highlighted source code" , Option [] ["html-dir"] (ReqArg htmlDirFlag "DIR")- "directory in which HTML files are placed"+ ("directory in which HTML files are placed (default: " +++ defaultHTMLDir ++ ")") , Option [] ["css"] (ReqArg cssFlag "URL") "the CSS file used by the HTML files (can be relative)" , Option [] ["ignore-interfaces"] (NoArg ignoreInterfacesFlag)@@ -304,7 +310,7 @@ usageInfo (header progName) options ++ "\nPlugins:\n" ++ indent (concatMap pluginMsg pluginInfos)- + where header progName = unlines [ "Agda 2" , ""@@ -313,7 +319,7 @@ indent = unlines . map (" " ++) . lines - pluginMsg (name, help, inherited, opts) + pluginMsg (name, help, inherited, opts) | null opts && null inherited = optHeader | otherwise = usageInfo (optHeader ++ " Plugin-specific options:" ++
src/full/Agda/Main.hs view
@@ -15,6 +15,7 @@ import System.Environment import System.Exit+import System.FilePath import qualified System.IO.UTF8 as UTF8 import Agda.Syntax.Position@@ -70,9 +71,9 @@ case opts of Left err -> liftIO $ optionError err Right opts- | optShowHelp opts -> liftIO printUsage- | optShowVersion opts -> liftIO printVersion- | optRunTests opts -> liftIO $ do+ | optShowHelp opts -> liftIO printUsage+ | optShowVersion opts -> liftIO printVersion+ | optRunTests opts -> liftIO $ do ok <- testSuite unless ok exitFailure | isNothing (optInputFile opts)
src/full/Agda/Syntax/Concrete/Definitions.hs view
@@ -251,7 +251,7 @@ where dataOrRec mkDef niceD r x tel t cs = do ds <- niceD fixs cs- return $ + return $ [ NiceDef r [d] [ Axiom (fuseRange x t) f PublicAccess ConcreteDef x (Pi tel t)@@ -435,7 +435,7 @@ mkPrivateClause (Clause x lhs rhs wh with) = Clause x lhs rhs (mkPrivateWhere wh) (map mkPrivateClause with)- + mkPrivateWhere NoWhere = NoWhere mkPrivateWhere (AnyWhere ds) = AnyWhere [Private (getRange ds) ds] mkPrivateWhere (SomeWhere m ds) = SomeWhere m [Private (getRange ds) ds]
src/full/Agda/Syntax/Concrete/Operators/Parser.hs view
@@ -101,7 +101,7 @@ return $ f e where restP = return id +++ do- f <- binop op + f <- binop op e <- p return $ flip f e
src/full/Agda/Syntax/Concrete/Pretty.hs view
@@ -208,7 +208,7 @@ ] $$ nest 2 (vcat $ map pretty cs) Infix f xs -> pretty f <+> (fsep $ punctuate comma $ map pretty xs)- + Mutual _ ds -> namedBlock "mutual" ds Abstract _ ds -> namedBlock "abstract" ds Private _ ds -> namedBlock "private" ds@@ -225,7 +225,7 @@ , nest 2 $ text "=" <+> pretty e <+> pretty i ] Open _ x i -> hsep [ text "open", pretty x, pretty i ]- Import _ x rn open i -> + Import _ x rn open i -> hsep [ pretty open, text "import", pretty x, as rn, pretty i ] where as Nothing = empty
src/full/Agda/Syntax/Info.hs view
@@ -7,7 +7,7 @@ module Agda.Syntax.Info where -import Data.Generics(Data,Typeable) +import Data.Generics(Data,Typeable) import Agda.Syntax.Common import Agda.Syntax.Position import Agda.Syntax.Concrete
src/full/Agda/Syntax/Internal.hs view
@@ -45,10 +45,10 @@ deriving (Typeable, Data, Eq, Show) data Sort = Type Nat- | Prop + | Prop | Lub Sort Sort | Suc Sort- | MetaS MetaId + | MetaS MetaId deriving (Typeable, Data, Eq, Show) -- | Something where a meta variable may block reduction.@@ -122,9 +122,9 @@ killRange = fmap killRange -- | Type of argument lists.--- -type Args = [Arg Term] - +--+type Args = [Arg Term]+ -- | Sequence of types. An argument of the first type is bound in later types -- and so on. data Telescope = EmptyTel@@ -151,7 +151,7 @@ instance Foldable Abs where foldr f z (Abs _ t) = f t z -instance Traversable Abs where +instance Traversable Abs where traverse f (Abs x t) = Abs x <$> f t instance Sized a => Sized (Abs a) where@@ -186,7 +186,7 @@ , clauseBody :: ClauseBody } deriving (Typeable, Data, Show)-data ClauseBody = Body Term +data ClauseBody = Body Term | Bind (Abs ClauseBody) | NoBind ClauseBody | NoBody -- for absurd clauses
src/full/Agda/Syntax/Parser/Monad.hs view
@@ -144,7 +144,7 @@ -- showInp "" = "at end of file" -- showInp t = "on input " ++ elide 5 t--- +-- -- elide 3 s -- | length (take 4 s) < 4 = s -- | otherwise = "..."
src/full/Agda/Syntax/Parser/StringLiterals.hs view
@@ -142,7 +142,7 @@ readNum :: (Char -> Bool) -> Int -> (Char -> Int) -> LookAhead Char readNum isDigit base conv = do c <- eatNextChar- if isDigit c + if isDigit c then readNumAcc isDigit base conv (conv c) else fail "non-digit in numeral"
src/full/Agda/Syntax/Scope/Base.hs view
@@ -169,7 +169,7 @@ } -- | Map monadic function over a namespace.-mapNameSpaceM :: Monad m => +mapNameSpaceM :: Monad m => (NamesInScope -> m NamesInScope ) -> (ModulesInScope -> m ModulesInScope) -> NameSpace -> m NameSpace
src/full/Agda/Syntax/Translation/AbstractToConcrete.hs view
@@ -200,7 +200,7 @@ withAbstractPrivate i m = case (defAccess i, defAbstract i) of (PublicAccess, ConcreteDef) -> m- (p,a) -> + (p,a) -> do ds <- m return $ abst a $ priv p $ ds where@@ -344,7 +344,7 @@ toConcrete (A.Fun i a b) = bracket piBrackets- $ do a' <- toConcreteCtx FunctionSpaceDomainCtx a + $ do a' <- toConcreteCtx FunctionSpaceDomainCtx a b' <- toConcreteCtx TopCtx b return $ C.Fun (getRange i) (mkArg a') b' where
src/full/Agda/Syntax/Translation/ConcreteToAbstract.hs view
@@ -238,7 +238,7 @@ flatten (x,(y,z)) = (x,y,z) instance ToAbstract c a => ToAbstract [c] [a] where- toAbstract = mapM toAbstract + toAbstract = mapM toAbstract instance ToAbstract c a => ToAbstract (Maybe c) (Maybe a) where toAbstract Nothing = return Nothing@@ -605,7 +605,7 @@ do let cs = map conName cons dups = nub $ cs \\ nub cs bad = filter (`elem` dups) cs- unless (distinct cs) $ + unless (distinct cs) $ setCurrentRange (getRange bad) $ typeError $ DuplicateConstructors dups
src/full/Agda/Syntax/Translation/InternalToAbstract.hs view
@@ -411,7 +411,7 @@ instance (Reify i1 a1, Reify i2 a2) => Reify (i1,i2) (a1,a2) where reify (x,y) = (,) <$> reify x <*> reify y -instance (Reify t t', Reify a a') +instance (Reify t t', Reify a a') => Reify (Judgement t a) (Judgement t' a') where reify (HasType i t) = HasType <$> reify i <*> reify t reify (IsSort i) = IsSort <$> reify i
src/full/Agda/Termination/CallGraph.hs view
@@ -54,7 +54,7 @@ -- @'Unknown' '<=' 'Le' '<=' 'Lt'@. -- -- See 'Call' for more information.--- +-- -- TODO: document orders which are call-matrices themselves. data Order = Lt | Le | Unknown | Mat (Matrix Integer Order)@@ -64,7 +64,7 @@ show Lt = "<" show Le = "=" show Unknown = "?"- show (Mat m) = "Mat " ++ show m + show (Mat m) = "Mat " ++ show m --instance Ord Order where -- max = maxO@@ -76,7 +76,7 @@ coarbitrary Lt = variant 0 coarbitrary Le = variant 1 coarbitrary Unknown = variant 2- coarbitrary (Mat m) = variant 3 + coarbitrary (Mat m) = variant 3 -- | Multiplication of 'Order's. (Corresponds to sequential -- composition.)@@ -87,7 +87,7 @@ Lt .*. _ = Lt Le .*. o = o Unknown .*. _ = Unknown-(Mat m1) .*. (Mat m2) = if (okM m1 m2) then +(Mat m1) .*. (Mat m2) = if (okM m1 m2) then Mat $ mul orderSemiring m1 m2 else (collapse m1) .*. (collapse m2)@@ -107,7 +107,7 @@ supremum = foldr maxO Unknown maxO :: Order -> Order -> Order-maxO o1 o2 = case (o1,o2) of +maxO o1 o2 = case (o1,o2) of (_,Lt) -> Lt (Lt,_) -> Lt (Unknown,_) -> o2@@ -123,7 +123,7 @@ -- infimum = foldr min Lt -- DELETE ? -- | @('Order', 'max', '.*.')@ forms a semiring, with 'Unknown' as zero--- and 'Le' as one. +-- and 'Le' as one. orderSemiring :: Semiring Order orderSemiring =
src/full/Agda/Termination/Matrix.hs view
@@ -310,10 +310,10 @@ ------------------------------------------------------------------------ -- Zipping (assumes non-empty matrices) -zipWith :: (a -> b -> c) -> +zipWith :: (a -> b -> c) -> Matrix Integer a -> Matrix Integer b -> Matrix Integer c-zipWith f m1 m2 - = fromLists (Size { rows = toInteger $ length ll, +zipWith f m1 m2+ = fromLists (Size { rows = toInteger $ length ll, cols = toInteger $ length (head ll) }) ll where ll = List.zipWith (List.zipWith f) (toLists m1) (toLists m2)
src/full/Agda/Termination/TermCheck.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE CPP #-} {- Checking for Structural recursion- Authors: Andreas Abel, Nils Anders Danielsson, Ulf Norell, + Authors: Andreas Abel, Nils Anders Danielsson, Ulf Norell, Karl Mehltretter and others Created: 2007-05-28 Source : TypeCheck.Rules.Decl@@ -115,7 +115,7 @@ case r of Right _ -> return r Left _ -> do- -- now try to termination check regarding the dot patterns + -- now try to termination check regarding the dot patterns calls2 <- collect conf{ useDotPatterns = True } reportS "term.lex" 30 $ unlines [ "Calls (dot patterns): " ++ show calls2@@ -236,7 +236,7 @@ instance PrettyTCM DeBruijnPat where prettyTCM (VarDBP i) = text $ show i prettyTCM (ConDBP c ps) = parens (prettyTCM c <+> hsep (map prettyTCM ps))- prettyTCM (LitDBP l) = prettyTCM l + prettyTCM (LitDBP l) = prettyTCM l unusedVar :: DeBruijnPat unusedVar = LitDBP (LitString noRange "term.unused.pat.var")@@ -314,7 +314,7 @@ return $ Just (i - 1, t, absBody b) stripBind conf i (DotP _) (Body b) = __IMPOSSIBLE__ stripBind conf i (LitP l) b = return $ Just (i, LitDBP l, b)-stripBind conf i (ConP c args) b = do +stripBind conf i (ConP c args) b = do r <- stripBinds conf i (map unArg args) b case r of Just (i', dbps, b') -> return $ Just (i', ConDBP c dbps, b')@@ -371,7 +371,7 @@ , nest 2 $ text "rhs:" <+> prettyTCM t0 ]) loop pats0 Le t0- where + where Just fInd = toInteger <$> List.elemIndex f names loop :: [DeBruijnPat] -> Order -> Term -> TCM Calls loop pats guarded t = do@@ -394,17 +394,17 @@ calls <- collectCalls (loop pats Unknown) args - reportSDoc "term.found.call" 10 + reportSDoc "term.found.call" 10 (sep [ text "found call from" <+> prettyTCM f , nest 2 $ text "to" <+> prettyTCM g ]) -- insert this call into the call list case List.elemIndex g names of- + -- call leads outside the mutual block and can be ignored Nothing -> return calls- + -- call is to one of the mutally recursive functions Just gInd' -> do @@ -413,14 +413,14 @@ nrows = genericLength args + 1 matrix' = addGuardedness guarded (ncols - 1) matrix - reportSDoc "term.kept.call" 10 + reportSDoc "term.kept.call" 10 (sep [ text "kept call from" <+> prettyTCM f <+> hsep (map prettyTCM pats)- , nest 2 $ text "to" <+> prettyTCM g <+> + , nest 2 $ text "to" <+> prettyTCM g <+> hsep (map (parens . prettyTCM) args) , nest 2 $ text ("call matrix: " ++ show matrix) ])- + return (Term.insert (Term.Call { Term.source = fInd@@ -470,12 +470,12 @@ {- | compareArgs suc pats ts - compare a list of de Bruijn patterns (=parameters) @pats@ - with a list of arguments @ts@ and create a call maxtrix + compare a list of de Bruijn patterns (=parameters) @pats@+ with a list of arguments @ts@ and create a call maxtrix with |ts| rows and |pats| columns. If sized types are enabled, @suc@ is the name of the size successor.- -} + -} compareArgs :: Maybe QName -> [DeBruijnPat] -> [Term] -> TCM [[Term.Order]] compareArgs suc pats ts = mapM (\t -> mapM (compareTerm suc t) pats) ts @@ -532,7 +532,7 @@ case (length ts, length ps) of (0,0) -> return Term.Le -- c <= c (0,1) -> return Term.Unknown -- c not<= c x- (1,0) -> __IMPOSSIBLE__ + (1,0) -> __IMPOSSIBLE__ (1,1) -> compareTerm' suc (unArg (head ts)) (head ps) (_,_) -> do -- build "call matrix" m <- mapM (\t -> mapM (compareTerm' suc (unArg t)) ps) ts@@ -551,5 +551,5 @@ compareVar i (LitDBP _) = return $ Term.Unknown compareVar i (ConDBP c ps) = do os <- mapM (compareVar i) ps- let o = Term.supremum os + let o = Term.supremum os return $ (Term..*.) Term.Lt o
src/full/Agda/Termination/Termination.hs view
@@ -47,11 +47,11 @@ -- positive. -- -- The termination criterion is taken from Jones et al.--- In the completed call graph, each idempotent call-matrix +-- In the completed call graph, each idempotent call-matrix -- from a function to itself must have a decreasing argument. -- Idempotency is wrt. matrix multiplication. ----- This criterion is strictly more liberal than searching for a +-- This criterion is strictly more liberal than searching for a -- lexicographic order (and easier to implement, but harder to justify). terminates :: (Ord meta, Monoid meta) => CallGraph meta -> Either meta ()@@ -63,12 +63,12 @@ checkIdems [] = Right () checkIdems ((c,m):xs) = if (checkIdem c) then checkIdems xs else Left m -{- Convention (see TermCheck): +{- Convention (see TermCheck): Guardedness flag is in position (0,0) of the matrix, it is always present even if the functions are all recursive. The examples below do not include the guardedness flag, though. -}- + checkIdem :: Call -> Bool checkIdem c = let b = target c == source c@@ -105,14 +105,14 @@ flat = 1 aux = 2 c1 = Call { source = flat, target = aux- , cm = CallMatrix $ fromLists (Size 2 1) [[Lt], [Lt]] + , cm = CallMatrix $ fromLists (Size 2 1) [[Lt], [Lt]] } c2 = Call { source = aux, target = aux , cm = CallMatrix $ fromLists (Size 2 2) [ [Lt, Unknown]- , [Unknown, Le]] + , [Unknown, Le]] } c3 = Call { source = aux, target = flat- , cm = CallMatrix $ fromLists (Size 1 2) [[Unknown, Le]] + , cm = CallMatrix $ fromLists (Size 1 2) [[Unknown, Le]] } prop_terminates_example1 = isRight $ terminates example1@@ -130,10 +130,10 @@ plus = 1 c = Call { source = plus, target = plus , cm = CallMatrix $ fromLists (Size 2 2) [ [Unknown, Le]- , [Lt, Unknown] ] + , [Lt, Unknown] ] } -prop_terminates_example2 = isRight $ terminates example2 +prop_terminates_example2 = isRight $ terminates example2 -- | A related example which is anyway handled: argument swapping addition -- using two alternating functions.@@ -153,10 +153,10 @@ plus' = 2 c f g = Call { source = f, target = g , cm = CallMatrix $ fromLists (Size 2 2) [ [Unknown, Le]- , [Lt, Unknown] ] + , [Lt, Unknown] ] } -prop_terminates_example3 = isRight $ terminates example3 +prop_terminates_example3 = isRight $ terminates example3 -- | A contrived example. --@@ -176,22 +176,22 @@ g = 2 c1 = Call { source = f, target = f , cm = CallMatrix $ fromLists (Size 2 2) [ [Le, Unknown]- , [Unknown, Le] ] + , [Unknown, Le] ] } c2 = Call { source = f, target = g , cm = CallMatrix $ fromLists (Size 2 2) [ [Lt, Unknown]- , [Unknown, Le] ] + , [Unknown, Le] ] } c3 = Call { source = g, target = f , cm = CallMatrix $ fromLists (Size 2 2) [ [Le, Unknown]- , [Unknown, Le] ] + , [Unknown, Le] ] } prop_terminates_example4 = isLeft $ terminates example4 -- | This should terminate. ----- @f (S x) (S y) = g x (S y) + f (S (S x)) y@ +-- @f (S x) (S y) = g x (S y) + f (S (S x)) y@ -- -- @g (S x) (S y) = f (S x) (S y) + g x (S y)@ @@ -202,22 +202,22 @@ g = 2 c1 = Call { source = f, target = g , cm = CallMatrix $ fromLists (Size 2 2) [ [Lt, Unknown]- , [Unknown, Le] ] + , [Unknown, Le] ] } c2 = Call { source = f, target = f , cm = CallMatrix $ fromLists (Size 2 2) [ [Unknown, Unknown]- , [Unknown, Lt] ] + , [Unknown, Lt] ] } c3 = Call { source = g, target = f , cm = CallMatrix $ fromLists (Size 2 2) [ [Le, Unknown]- , [Unknown, Le] ] + , [Unknown, Le] ] } c4 = Call { source = g, target = g , cm = CallMatrix $ fromLists (Size 2 2) [ [Lt, Unknown]- , [Unknown, Le] ] + , [Unknown, Le] ] } -prop_terminates_example5 = isRight $ terminates example5 +prop_terminates_example5 = isRight $ terminates example5 -- | Another example which should fail. --@@ -233,16 +233,16 @@ where f = 1 c1 = Call { source = f, target = f- , cm = CallMatrix $ fromLists (Size 1 1) [ [Lt] ] + , cm = CallMatrix $ fromLists (Size 1 1) [ [Lt] ] } c2 = Call { source = f, target = f- , cm = CallMatrix $ fromLists (Size 1 1) [ [Le] ] + , cm = CallMatrix $ fromLists (Size 1 1) [ [Le] ] } c3 = Call { source = f, target = f- , cm = CallMatrix $ fromLists (Size 1 1) [ [Le] ] + , cm = CallMatrix $ fromLists (Size 1 1) [ [Le] ] } -prop_terminates_example6 = isLeft $ terminates example6 +prop_terminates_example6 = isLeft $ terminates example6 ------------------------------------------------------------------------ -- All tests
src/full/Agda/TypeChecking/Conversion.hs view
@@ -249,7 +249,7 @@ a <- reduce a case funView (unEl a) of FunV (Arg _ b) _ -> do- reportSDoc "tc.conv.args" 10 $ + reportSDoc "tc.conv.args" 10 $ sep [ text "compareArgs" <+> parens (text $ show pol) , nest 2 $ sep [ prettyTCM arg1 , text "~~" <+> prettyTCM arg2
src/full/Agda/TypeChecking/Coverage.hs view
@@ -80,7 +80,7 @@ whenM (optCompletenessCheck <$> commandLineOptions) $ case pss of [] -> return ()- _ -> + _ -> setCurrentRange (getRange cs) $ typeError $ CoverageFailure f pss whenM (optUnreachableCheck <$> commandLineOptions) $@@ -207,7 +207,7 @@ let theta = delta1 `abstract` gamma `abstract` delta2' debugTel "theta" theta - -- Apply the unifying substitution to Θ + -- Apply the unifying substitution to Θ -- We get ρ' : Θ' -> Θ -- π : Θ' -> Θ (theta', iperm, rho', _) <- instantiateTel sub' theta
src/full/Agda/TypeChecking/Errors.hs view
@@ -105,7 +105,6 @@ FieldOutsideRecord -> "FieldOutsideRecord" FileNotFound _ _ -> "FileNotFound" GenericError _ -> "GenericError"- HTMLDirUndefined -> "HTMLDirUndefined" IlltypedPattern _ _ -> "IlltypedPattern" IncompletePatternMatching _ _ -> "IncompletePatternMatching" InternalError _ -> "InternalError"@@ -374,12 +373,12 @@ two = zipWith (\a b -> [a,b]) s (tail s) NoSuchModule x -> fsep $ pwords "No such module" ++ [pretty x]- AmbiguousName x ys -> vcat + AmbiguousName x ys -> vcat [ fsep $ pwords "Ambiguous name" ++ [pretty x <> text "."] ++ pwords "It could refer to any one of" , nest 2 $ vcat $ map nameWithBinding ys ]- AmbiguousModule x ys -> vcat + AmbiguousModule x ys -> vcat [ fsep $ pwords "Ambiguous module name" ++ [pretty x <> text "."] ++ pwords "It could refer to any one of" , nest 2 $ vcat $ map prettyTCM ys@@ -485,8 +484,7 @@ com [] = empty com (_:_) = comma- HTMLDirUndefined ->- fwords "You have to specify where to place the HTML files."+ where mpar n args | n > 0 && not (null args) = parens
src/full/Agda/TypeChecking/Free.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE CPP #-} -- | Computing the free variables of a term.-module Agda.TypeChecking.Free +module Agda.TypeChecking.Free ( FreeVars(..) , Free(..) , allVars
src/full/Agda/TypeChecking/MetaVars.hs view
@@ -343,7 +343,7 @@ pr _ = text ".." in text "args:" <+> sep (map (pr . unArg) args)- + ids <- checkArgs x args reportSDoc "tc.meta.assign" 15 $@@ -439,7 +439,7 @@ updateMeta :: (MonadTCM tcm, Data a, Occurs a, Abstract a) => MetaId -> a -> tcm ()-updateMeta mI t = +updateMeta mI t = do mv <- lookupMeta mI withMetaInfo (getMetaInfo mv) $ do args <- getContextArgs
src/full/Agda/TypeChecking/Monad/Base.hs view
@@ -234,7 +234,7 @@ -- ** Meta variables --------------------------------------------------------------------------- -data MetaVariable = +data MetaVariable = MetaVar { mvInfo :: MetaInfo , mvPriority :: MetaPriority -- ^ some metavariables are more eager to be instantiated , mvJudgement :: Judgement Type MetaId@@ -291,7 +291,7 @@ getMetaEnv m = clEnv $ getMetaInfo m getMetaSig :: MetaVariable -> Signature-getMetaSig m = clSignature $ getMetaInfo m +getMetaSig m = clSignature $ getMetaInfo m --------------------------------------------------------------------------- -- ** Interaction meta variables@@ -803,9 +803,8 @@ | AmbiguousParseForApplication [C.Expr] [C.Expr] | NoParseForLHS C.Pattern | AmbiguousParseForLHS C.Pattern [C.Pattern]- -- Usage errors.- | HTMLDirUndefined- deriving (Typeable)+ -- Usage errors+ deriving (Typeable) data TCErr = TypeError TCState (Closure TypeError) | Exception Range String
src/full/Agda/TypeChecking/Monad/Builtin.hs view
@@ -20,7 +20,7 @@ Just (Builtin y) -> typeError $ DuplicateBuiltinBinding b y x Just (Prim _) -> typeError $ NoSuchBuiltinName b Nothing -> modify $ \st ->- st { stLocalBuiltins = + st { stLocalBuiltins = Map.insert b (Builtin x) $ stLocalBuiltins st }
src/full/Agda/TypeChecking/Monad/Closure.hs view
@@ -13,5 +13,5 @@ $ withEnv env $ withTrace trace $ k x- +
src/full/Agda/TypeChecking/Monad/Env.hs view
@@ -30,7 +30,7 @@ local $ \e -> e { envAnonymousModules = (m, n) : envAnonymousModules e } --- | Set the current environment to the given +-- | Set the current environment to the given withEnv :: MonadTCM tcm => TCEnv -> tcm a -> tcm a withEnv env m = local (const env) m
src/full/Agda/TypeChecking/Monad/MetaVars.hs view
@@ -46,7 +46,7 @@ getMetaPriority i = mvPriority <$> lookupMeta i createMetaInfo :: MonadTCM tcm => tcm MetaInfo-createMetaInfo = +createMetaInfo = do r <- getCurrentRange buildClosure r @@ -79,14 +79,14 @@ isInteractionMeta m = fmap (m `elem`) getInteractionMetas lookupInteractionId :: MonadTCM tcm => InteractionId -> tcm MetaId-lookupInteractionId ii = +lookupInteractionId ii = do mmi <- Map.lookup ii <$> gets stInteractionPoints case mmi of Just mi -> return mi _ -> fail $ "no such interaction point: " ++ show ii judgementInteractionId :: MonadTCM tcm => InteractionId -> tcm (Judgement Type MetaId)-judgementInteractionId ii = +judgementInteractionId ii = do mi <- lookupInteractionId ii mvJudgement <$> lookupMeta mi @@ -112,7 +112,7 @@ getInteractionScope :: MonadTCM tcm => InteractionId -> tcm ScopeInfo-getInteractionScope ii = +getInteractionScope ii = do mi <- lookupInteractionId ii mv <- lookupMeta mi return $ getMetaScope mv
src/full/Agda/TypeChecking/Monad/Signature.hs view
@@ -73,7 +73,7 @@ where d' = d { defName = q } new +++ old = new { defDisplay = defDisplay new ++ defDisplay old }- + hideTel EmptyTel = EmptyTel hideTel (ExtendTel (Arg _ t) tel) = ExtendTel (Arg Hidden t) $ hideTel <$> tel @@ -413,7 +413,7 @@ current = envCurrentModule env m = qnameModule q --- | get type of a constant +-- | get type of a constant typeOfConst :: MonadTCM tcm => QName -> tcm Type typeOfConst q = defType <$> (instantiateDef =<< getConstInfo q)
src/full/Agda/TypeChecking/Polarity.hs view
@@ -90,7 +90,7 @@ isLin <- checkSizeIndex np sizeArg target return $ isPos && isLin- + ifM (and <$> mapM check cons) (return [Covariant]) (return [Invariant])
src/full/Agda/TypeChecking/Positivity.hs view
@@ -393,7 +393,7 @@ occs <- computeOccurrences q let onItem (item, occs) = do es <- mapM (computeEdge qs) occs- return $ Graph.unions $ + return $ Graph.unions $ map (\(b, w) -> Graph.singleton (itemToNode item) b w) es Graph.unions <$> mapM onItem (Map.assocs occs) where
src/full/Agda/TypeChecking/Primitive.hs view
@@ -196,7 +196,7 @@ _ -> return $ NoReduction t -- | Conceptually: @redBind m f k = either (return . Left . f) k =<< m@-redBind :: MonadTCM tcm => tcm (Reduced a a') -> (a -> b) -> +redBind :: MonadTCM tcm => tcm (Reduced a a') -> (a -> b) -> (a' -> tcm (Reduced b b')) -> tcm (Reduced b b') redBind ma f k = do r <- ma
src/full/Agda/TypeChecking/Reduce.hs view
@@ -225,7 +225,7 @@ (_, []) -> defaultResult -- no definition for head (_, cls@(Clause{ clausePats = ps } : _)) | length ps <= length args ->- do let (args1,args2) = splitAt (length ps) args + do let (args1,args2) = splitAt (length ps) args ev <- appDef v0 cls args1 case ev of NoReduction v -> return $ v `apply` args2@@ -249,7 +249,7 @@ DontKnow (Just m) -> return $ NoReduction $ blocked m $ v `apply` args Yes args' | hasBody body -> return $ YesReduction (- -- TODO: let matchPatterns also return the reduced forms + -- TODO: let matchPatterns also return the reduced forms -- of the original arguments! app args' body) | otherwise -> return $ NoReduction $ notBlocked $ v `apply` args
src/full/Agda/TypeChecking/Rules/Data.hs view
@@ -47,7 +47,7 @@ -- Look up the type of the datatype. t <- instantiateFull =<< typeOfConst name - -- The parameters are in scope when checking the constructors. + -- The parameters are in scope when checking the constructors. dataDef <- bindParameters ps t $ \tel t0 -> do -- Parameters are always hidden in constructors
src/full/Agda/TypeChecking/Rules/Def.hs view
@@ -133,7 +133,7 @@ traceCall (CheckClause t c) $ checkLeftHandSide c aps t $ \gamma delta sub xs ps t' perm -> do let mkBody v = foldr (\x t -> Bind $ Abs x t) (Body $ substs sub v) xs- (body, with) <- checkWhere (size delta) wh $ + (body, with) <- checkWhere (size delta) wh $ case rhs of A.RHS e | any (containsAbsurdPattern . namedThing . unArg) aps ->
src/full/Agda/TypeChecking/Rules/LHS.hs view
@@ -85,7 +85,7 @@ -- be longer than the pattern dpi [] _ _ = [] dpi (_ : ps) (Nothing : s) as = dpi ps s as- dpi (p : ps) (Just u : s) (a : as) = + dpi (p : ps) (Just u : s) (a : as) = case p of A.DotP _ e -> DPI e u a : dpi ps s as A.ImplicitP _ -> dpi ps s as@@ -274,7 +274,7 @@ let TelV tel0' b0 = telView a ps <- insertImplicitPatterns ps tel0' unless (size tel0' >= size ps) $ typeError $ TooManyArgumentsInLHS (size ps) a- let tel0 = useNamesFromPattern ps tel0' + let tel0 = useNamesFromPattern ps tel0' (as, bs) = splitAt (size ps) $ telToList tel0 gamma = telFromList as b = telePi (telFromList bs) b0
src/full/Agda/TypeChecking/Rules/LHS/Instantiate.hs view
@@ -48,7 +48,7 @@ -- s' : Substitution Γσ let s' = rename psR s - reportSDoc "tc.lhs.inst" 15 $ nest 2 $ + reportSDoc "tc.lhs.inst" 15 $ nest 2 $ text "s' =" <+> fsep (punctuate comma $ map (maybe (text "_") prettyTCM) s') -- rho : [Tm Γσ]Γ@@ -58,20 +58,20 @@ let tel1 = flattenTel tel names1 = teleNames tel - reportSDoc "tc.lhs.inst" 15 $ nest 2 $ + reportSDoc "tc.lhs.inst" 15 $ nest 2 $ text "tel1 =" <+> brackets (fsep $ punctuate comma $ map prettyTCM tel1) -- tel2 : [Type Γσ]Γ let tel2 = substs rho tel1 - reportSDoc "tc.lhs.inst" 15 $ nest 2 $ + reportSDoc "tc.lhs.inst" 15 $ nest 2 $ text "tel2 =" <+> brackets (fsep $ punctuate comma $ map prettyTCM tel2) -- tel3 : [Type Γσ]Γσ tel3 <- instantiateFull $ permute ps tel2 let names3 = permute ps names1 - reportSDoc "tc.lhs.inst" 15 $ nest 2 $ + reportSDoc "tc.lhs.inst" 15 $ nest 2 $ text "tel3 =" <+> brackets (fsep $ punctuate comma $ map prettyTCM tel3) -- p : Permutation (Γσ -> Γσ~)@@ -86,13 +86,13 @@ let tel4 = substs rho' (permute p tel3) names4 = permute p names3 - reportSDoc "tc.lhs.inst" 15 $ nest 2 $ + reportSDoc "tc.lhs.inst" 15 $ nest 2 $ text "tel4 =" <+> brackets (fsep $ punctuate comma $ map prettyTCM tel4) -- tel5 = Γσ~ let tel5 = unflattenTel names4 tel4 - reportSDoc "tc.lhs.inst" 15 $ nest 2 $ + reportSDoc "tc.lhs.inst" 15 $ nest 2 $ text "tel5 =" <+> prettyTCM tel5 -- remember the types of the instantiations
src/full/Agda/TypeChecking/Rules/Record.hs view
@@ -46,7 +46,7 @@ let m = mnameFromList $ qnameToList name hide (Arg _ x) = Arg Hidden x htel = map hide $ telToList tel- rect = El s $ Def name $ reverse + rect = El s $ Def name $ reverse [ Arg h (Var i []) | (i, Arg h _) <- zip [0..] $ reverse $ telToList gamma ]@@ -120,7 +120,7 @@ setScope scope >> checkProjs ftel1 ftel2 (fs' ++ fs) checkProjs ftel1 (ExtendTel (Arg _ _) ftel2) (A.Field info x t : fs) = do -- check the type (in the context of the telescope)- -- the previous fields will be free in + -- the previous fields will be free in reportSDoc "tc.rec.proj" 5 $ sep [ text "checking projection" , nest 2 $ vcat
src/full/Agda/TypeChecking/Serialise.hs view
@@ -272,7 +272,7 @@ value n = A.MName `fmap` value n instance EmbPrj A.Name where- icode (A.Name a b c d) = icode4' a b c d + icode (A.Name a b c d) = icode4' a b c d value = vcase valu where valu [a, b, c, d] = valu4 A.Name a b c d valu _ = __IMPOSSIBLE__ @@ -346,8 +346,8 @@ icode (Fun a b) = icode2 6 a b icode (Sort a ) = icode1 7 a icode (MetaV a b) = icode2 8 a b- value = vcase valu where valu [0, a, b] = valu2 Var a b - valu [1, a, b] = valu2 Lam a b + value = vcase valu where valu [0, a, b] = valu2 Var a b+ valu [1, a, b] = valu2 Lam a b valu [2, a] = valu1 Lit a valu [3, a, b] = valu2 Def a b valu [4, a, b] = valu2 Con a b@@ -623,7 +623,7 @@ case maybeU of Just (U u) -> maybe (__IMPOSSIBLE__) return (cast u) Nothing -> do- v <- valu . (! ix) =<< asks nodeE + v <- valu . (! ix) =<< asks nodeE lift $ H.insert memo (ix, aTyp) (U v) return v @@ -682,7 +682,7 @@ where f m c = fromIntegral c * magic + hashInt32 m magic = 0xdeadbeef golden :: Int32- golden = 1013904242 + golden = 1013904242 hashInt32 x = mulHi x golden + x mulHi :: Int32 -> Int32 -> Int32 mulHi a b = fromIntegral (r `shiftR` 32)
src/full/Agda/TypeChecking/SizedTypes.hs view
@@ -35,7 +35,7 @@ ] u <- reduce u v <- reduce v- reportSDoc "tc.conv.size" 15 $ + reportSDoc "tc.conv.size" 15 $ nest 2 $ sep [ text (show u) <+> prettyTCM cmp , text (show v) ]@@ -57,7 +57,7 @@ trivial u v = liftTCM $ do a <- sizeExpr u b <- sizeExpr v- reportSDoc "tc.conv.size" 15 $ + reportSDoc "tc.conv.size" 15 $ nest 2 $ sep [ text (show a) <+> text "<=" , text (show b) ]@@ -122,7 +122,7 @@ -- | Throws a 'patternViolation' if the term isn't a proper size expression. sizeExpr :: MonadTCM tcm => Term -> tcm (SizeExpr, Int) sizeExpr u = do- u <- reduce u -- Andreas, 2009-02-09. + u <- reduce u -- Andreas, 2009-02-09. -- This is necessary to surface the solutions of metavariables. s <- sizeView u case s of@@ -234,7 +234,7 @@ -- type Solution = Map Int SizeExpr -- data SizeExpr = SizeVar Int Int -- e.g. x + 5 -- | SizeConst Weight -- a number or infinity--- data Weight = Finite Int | Infinite +-- data Weight = Finite Int | Infinite -- data Node = Rigid Rigid -- | Flex FlexId -- data Rigid = RConst Weight
src/full/Agda/TypeChecking/Substitute.hs view
@@ -34,7 +34,7 @@ Def c args' -> Def c (args' ++ args) Con c args' -> Con c (args' ++ args) Lam _ u -> absApp u v `apply` args0- MetaV x args' -> MetaV x (args' ++ args) + MetaV x args' -> MetaV x (args' ++ args) Lit l -> __IMPOSSIBLE__ Pi _ _ -> __IMPOSSIBLE__ Fun _ _ -> __IMPOSSIBLE__@@ -383,7 +383,7 @@ telePi EmptyTel t = t telePi (ExtendTel u tel) t = el $ fn u b where- el = El (sLub s1 s2) + el = El (sLub s1 s2) b = fmap (flip telePi t) tel s1 = getSort $ unArg u s2 = getSort $ absBody b@@ -397,7 +397,7 @@ telePi_ EmptyTel t = t telePi_ (ExtendTel u tel) t = el $ Pi u b where- el = El (sLub s1 s2) + el = El (sLub s1 s2) b = fmap (flip telePi_ t) tel s1 = getSort $ unArg u s2 = getSort $ absBody b
src/full/Agda/TypeChecking/Telescope.hs view
@@ -75,7 +75,7 @@ teleArgNames = map (fmap fst) . telToList teleArgs :: Telescope -> Args-teleArgs tel = +teleArgs tel = reverse [ Arg h (Var i []) | (i, Arg h _) <- zip [0..] $ reverse (telToList tel) ] -- | A telescope split in two.
src/full/Agda/TypeChecking/Test/Generators.hs view
@@ -139,7 +139,7 @@ , tcIsType = False } where- (defs, cons) = flip evalState 0 $ + (defs, cons) = flip evalState 0 $ (,) <$> mapM mkName ds <*> mapM mkName cs tick = do x <- get; put (x + 1); return x@@ -293,7 +293,7 @@ genName :: Gen Args -> Gen Term genName args = frequency- [ (varF, genVar args) + [ (varF, genVar args) , (defF, genDef args) , (conF, genCon args) ]@@ -352,14 +352,14 @@ xs1 = take n1 xs n2 = n - n1 xs2 = drop n1 xs- + [] `ilv` ys = ys xs `ilv` [] = xs (x:xs) `ilv` (y:ys) = x : y : (xs `ilv` ys)- + shrinkOne [] = [] shrinkOne (x:xs) = [ x' : noShrink xs | x' <- shrinkC conf x ]- ++ [ noShrink x : xs' | xs' <- shrinkOne xs ] + ++ [ noShrink x : xs' | xs' <- shrinkOne xs ] instance (ShrinkC a a', ShrinkC b b') => ShrinkC (a, b) (a', b') where noShrink (x, y) = (noShrink x, noShrink y)
src/full/Agda/TypeChecking/With.hs view
@@ -97,7 +97,7 @@ strip EmptyTel [] [] | 0 == 0 = return [] strip (ExtendTel a tel) (p : ps) (q : qs) = do reportSDoc "tc.with.strip" 15 $ vcat- [ text "strip" + [ text "strip" , nest 2 $ text "ps =" <+> fsep (punctuate comma $ map prettyA (p : ps)) , nest 2 $ text "qs =" <+> fsep (punctuate comma $ map (showPat . unArg) (q : qs)) , nest 2 $ text "tel=" <+> prettyTCM (ExtendTel a tel)@@ -123,7 +123,7 @@ ConP c qs' -> case namedThing $ unArg p of A.ConP _ (A.AmbQ cs') ps' -> do- + Con c' [] <- constructorForm =<< reduce (Con c []) c <- return $ c' `withRangeOf` c let getCon (Con c []) = c
src/full/Agda/Utils/List.hs view
@@ -12,7 +12,7 @@ import Data.Function type Prefix a = [a]-type Suffix a = [a] +type Suffix a = [a] -- | Check if a list has a given prefix. If so, return the list -- minus the prefix.
src/full/Agda/Utils/ReadP.hs view
@@ -12,13 +12,13 @@ -- Module : "Text.ParserCombinators.ReadP" -- Copyright : (c) The University of Glasgow 2002 -- License : BSD-style (see the file libraries/base/LICENSE)--- +-- -- Maintainer : libraries@haskell.org -- Stability : provisional -- Portability : non-portable (local universal quantification) -- -- This is a library of parser combinators, originally written by Koen Claessen.--- It parses all alternatives in parallel, so it never keeps hold of +-- It parses all alternatives in parallel, so it never keeps hold of -- the beginning of the input string, a common source of space leaks with -- other parsers. The '(+++)' choice combinator is genuinely commutative; -- it makes no difference which branch is \"shorter\".@@ -26,10 +26,10 @@ ----------------------------------------------------------------------------- module Agda.Utils.ReadP- ( + ( -- * The 'ReadP' type ReadP, -- :: * -> *; instance Functor, Monad, MonadPlus- + -- * Primitive operations get, -- :: ReadP Char look, -- :: ReadP String@@ -107,7 +107,7 @@ -- most common case: two gets are combined Get f1 `mplus` Get f2 = Get (\c -> f1 c `mplus` f2 c)- + -- results are delivered as soon as possible Result x p `mplus` q = Result x (p `mplus` q) p `mplus` Result x q = Result x (p `mplus` q)@@ -212,9 +212,9 @@ -- ^ Transforms a parser into one that does the same, but -- in addition returns the exact characters read. -- IMPORTANT NOTE: 'gather' gives a runtime error if its first argument--- is built using any occurrences of readS_to_P. +-- is built using any occurrences of readS_to_P. gather (R m) =- R (\k -> gath id (m (\a -> return (\s -> k (s,a))))) + R (\k -> gath id (m (\a -> return (\s -> k (s,a))))) where gath l (Get f) = Get (\c -> gath (l.(c:)) (f c)) gath l Fail = Fail@@ -454,7 +454,7 @@ > xs +<+ _ = xs > > prop_Gather s =-> forAll readPWithoutReadS $ \p -> +> forAll readPWithoutReadS $ \p -> > readP_to_S (gather p) s =~ > [ ((pre,x::Int),s') > | (x,s') <- readP_to_S p s
src/full/Agda/Utils/Serialise.hs view
@@ -45,7 +45,7 @@ mapS (IFun f g) sa = bindS g sa $ returnS . f (>->) :: BiMonad m => m a -> m b -> m (a,b)-sa >-> sb = bindS fst sa $ \a -> +sa >-> sb = bindS fst sa $ \a -> bindS snd sb $ \b -> returnS (a,b)
src/full/Agda/Utils/Trie.hs view
@@ -3,7 +3,7 @@ -- Module : Unstable.Org.Lochan.Trie -- Copyright : (c) Keith Wansbrough 2005 -- License : BSD-style--- +-- -- Maintainer : keith.hlib at lochan.org -- : modified and extended by Ulf Norell -- Stability : experimental@@ -29,8 +29,8 @@ -- * Derived operations takeWhile, takeWhile_V, fringe, ) where- + import Prelude hiding (takeWhile, lookup) import Data.Map (Map) import qualified Data.Map as Map@@ -78,7 +78,7 @@ where lift _ Nothing y = y lift _ x Nothing = x lift _ (Just x) (Just y) = Just (f x y)- + -- |Insertion. insert :: Ord k => [k] -> v -> Trie k v -> Trie k v
src/full/Agda/Utils/Warshall.hs view
@@ -31,10 +31,10 @@ -- assuming a square matrix warshall :: SemiRing a => Matrix a -> Matrix a-warshall a0 = loop r a0 where +warshall a0 = loop r a0 where b@((r,c),(r',c')) = bounds a0 -- assuming r == c and r' == c'- loop k a | k <= r' = - loop (k+1) (array b [ ((i,j), + loop k a | k <= r' =+ loop (k+1) (array b [ ((i,j), (a!(i,j)) `oplus` ((a!(i,k)) `otimes` (a!(k,j)))) | i <- [r..r'], j <- [c..c'] ]) | otherwise = a@@ -54,7 +54,7 @@ es <- Map.lookup i g foldr oplus Nothing [ Just v | (j', v) <- es, j == j' ] - m = array b [ ((n, m), edge i j) | (i, n) <- nodes, (j, m) <- nodes ] + m = array b [ ((n, m), edge i j) | (i, n) <- nodes, (j, m) <- nodes ] fromMatrix matrix = Map.fromList $ do (i, n) <- nodes@@ -64,9 +64,9 @@ ] return (i, es) --- edge weight in the graph, forming a semi ring +-- edge weight in the graph, forming a semi ring -data Weight = Finite Int | Infinite +data Weight = Finite Int | Infinite deriving (Eq) inc :: Weight -> Int -> Weight@@ -91,9 +91,9 @@ -- constraints --------------------------------------------------- --- nodes of the graph are either --- * flexible variables (with identifiers drawn from Int), --- * rigid variables (also identified by Ints), or +-- nodes of the graph are either+-- * flexible variables (with identifiers drawn from Int),+-- * rigid variables (also identified by Ints), or -- * constants (like 0, infinity, or anything between) data Node = Rigid Rigid@@ -107,7 +107,7 @@ type NodeId = Int type RigidId = Int type FlexId = Int-type Scope = RigidId -> Bool +type Scope = RigidId -> Bool -- which rigid variables a flex may be instatiated to instance Show Node where@@ -119,7 +119,7 @@ infinite (RConst Infinite) = True infinite _ = False --- isBelow r w r' +-- isBelow r w r' -- checks, if r and r' are connected by w (meaning w not infinite) -- wether r + w <= r' -- precondition: not the same rigid variable@@ -133,7 +133,7 @@ -- a constraint is an edge in the graph data Constraint = NewFlex FlexId Scope | Arc Node Int Node--- Arc v1 k v2 at least one of v1,v2 is a VMeta (Flex), +-- Arc v1 k v2 at least one of v1,v2 is a VMeta (Flex), -- the other a VMeta or a VGen (Rigid) -- if k <= 0 this means $^(-k) v1 <= v2 -- otherwise v1 <= $^k v3@@ -150,7 +150,7 @@ -- graph (matrix) ------------------------------------------------ -data Graph = Graph +data Graph = Graph { flexScope :: Map FlexId Scope -- scope for each flexible var , nodeMap :: Map Node NodeId -- node labels to node numbers , intMap :: Map NodeId Node -- node numbers to node labels@@ -185,7 +185,7 @@ } return i --- addEdge n1 k n2 +-- addEdge n1 k n2 -- improves the weight of egde n1->n2 to be at most k -- also adds nodes if not yet present addEdge :: Node -> Int -> Node -> GM ()@@ -205,13 +205,13 @@ buildGraph cs = execState (mapM_ addConstraint cs) initGraph mkMatrix :: Int -> (Int -> Int -> Weight) -> Matrix Weight-mkMatrix n g = array ((0,0),(n-1,n-1)) +mkMatrix n g = array ((0,0),(n-1,n-1)) [ ((i,j), g i j) | i <- [0..n-1], j <- [0..n-1]] -- displaying matrices with row and column labels -------------------- -- a matrix with row descriptions in b and column descriptions in c-data LegendMatrix a b c = LegendMatrix +data LegendMatrix a b c = LegendMatrix { matrix :: Matrix a , rowdescr :: Int -> b , coldescr :: Int -> c@@ -221,13 +221,13 @@ show (LegendMatrix m rd cd) = -- first show column description let ((r,c),(r',c')) = bounds m- in foldr (\ j s -> "\t" ++ show (cd j) ++ s) "" [c .. c'] ++ + in foldr (\ j s -> "\t" ++ show (cd j) ++ s) "" [c .. c'] ++ -- then output rows foldr (\ i s -> "\n" ++ show (rd i) ++- foldr (\ j t -> "\t" ++ show (m!(i,j)) ++ t) - (s) + foldr (\ j t -> "\t" ++ show (m!(i,j)) ++ t)+ (s) [c .. c'])- "" [r .. r'] + "" [r .. r'] -- solving the constraints ------------------------------------------- @@ -249,15 +249,15 @@ -- sizeRigid r n returns the size expression corresponding to r + n sizeRigid :: Rigid -> Int -> SizeExpr sizeRigid (RConst k) n = SizeConst (inc k n)-sizeRigid (RVar i) n = SizeVar i n +sizeRigid (RVar i) n = SizeVar i n {- apply :: SizeExpr -> Solution -> SizeExpr apply e@(SizeExpr (Rigid _) _) phi = e apply e@(SizeExpr (Flex x) i) phi = case Map.lookup x phi of Nothing -> e- Just (SizeExpr v j) -> SizeExpr v (i + j) - + Just (SizeExpr v j) -> SizeExpr v (i + j)+ after :: Solution -> Solution -> Solution after psi phi = Map.map (\ e -> e `apply` phi) psi -}@@ -304,12 +304,12 @@ -} solve :: Constraints -> Maybe Solution-solve cs = -- trace (show cs) $ - -- trace (show lm0) $ +solve cs = -- trace (show cs) $+ -- trace (show lm0) $ -- trace (show lm) $ -- trace (show d) $ let solution = if solvable then loop1 flexs rigids emptySolution else Nothing- in -- trace (show solution) $ + in -- trace (show solution) $ solution where -- compute the graph and its transitive closure m gr = buildGraph cs@@ -323,7 +323,7 @@ lm = LegendMatrix m legend legend -- trace only -- compute the sets of flexible and rigid node numbers- ns = Map.keys (nodeMap gr) + ns = Map.keys (nodeMap gr) -- a set of flexible variables flexs = foldl (\ l k -> case k of (Flex i) -> i : l (Rigid _) -> l) [] ns@@ -337,21 +337,21 @@ -- check whether there is a solution -- d = [ m!(i,i) | i <- [0 .. (n-1)] ] -- diagonal--- a rigid variable might not be less than it self, so no -.. on the +-- a rigid variable might not be less than it self, so no -.. on the -- rigid part of the diagonal solvable = all (\ x -> x >= Finite 0) [ m!(i,i) | i <- rInds ] && -- a rigid variable might not be bounded below by infinity or -- bounded above by a constant -- it might not be related to another rigid variable- all (\ (r, r') -> r == r' || + all (\ (r, r') -> r == r' || let Just row = (Map.lookup (Rigid r) (nodeMap gr)) Just col = (Map.lookup (Rigid r') (nodeMap gr)) edge = m!(row,col)- in isBelow r edge r' ) + in isBelow r edge r' ) [ (r,r') | r <- rigids, r' <- rigids ] && -- a flexible variable might not be strictly below a rigid variable- all (\ (x, v) -> + all (\ (x, v) -> let Just row = (Map.lookup (Flex x) (nodeMap gr)) Just col = (Map.lookup (Rigid (RVar v)) (nodeMap gr)) edge = m!(row,col)@@ -375,41 +375,41 @@ loop1 :: [FlexId] -> [Rigid] -> Solution -> Maybe Solution loop1 [] rgds subst = Just subst loop1 flxs [] subst = loop2 flxs subst- loop1 flxs (r:rgds) subst = + loop1 flxs (r:rgds) subst = let row = fromJust $ Map.lookup (Rigid r) (nodeMap gr) (flxs',subst') =- foldl (\ (flx,sub) f -> + foldl (\ (flx,sub) f -> let col = fromJust $ Map.lookup (Flex f) (nodeMap gr) in case (inScope f r, m!(row,col)) of--- Finite z | z <= 0 -> - (True, Finite z) -> +-- Finite z | z <= 0 ->+ (True, Finite z) -> let trunc z | z >= 0 = 0 | otherwise = -z in (flx, extendSolution sub f (sizeRigid r (trunc z))) _ -> (f : flx, sub)- ) ([], subst) flxs + ) ([], subst) flxs in loop1 flxs' rgds subst' {- loop2 while flexible variables j left search the row j for entry i- if j --n--> i with n >= 0 (meaning j <= i + n) then j = i + if j --n--> i with n >= 0 (meaning j <= i + n) then j = i -} loop2 :: [FlexId] -> Solution -> Maybe Solution- loop2 [] subst = Just subst + loop2 [] subst = Just subst loop2 (f:flxs) subst = loop3 0 subst where row = fromJust $ Map.lookup (Flex f) (nodeMap gr)- loop3 col subst | col >= n = + loop3 col subst | col >= n = -- default to infinity- loop2 flxs (extendSolution subst f (SizeConst Infinite)) + loop2 flxs (extendSolution subst f (SizeConst Infinite)) loop3 col subst = case Map.lookup col (intMap gr) of- Just (Rigid r) | not (infinite r) -> + Just (Rigid r) | not (infinite r) -> case (inScope f r, m!(row,col)) of- (True, Finite z) | z >= 0 -> - loop2 flxs (extendSolution subst f (sizeRigid r z)) + (True, Finite z) | z >= 0 ->+ loop2 flxs (extendSolution subst f (sizeRigid r z)) (_, Infinite) -> loop3 (col+1) subst _ -> -- trace ("unusable rigid: " ++ show r ++ " for flex " ++ show f) Nothing -- NOT: loop3 (col+1) subst