12 January 2017

patching ESS

System: Slackware Linux (version 14.0)
CPUs: Intel(R) Atom(TM) CPU N270 @1.60GHz
Deps: ess-16.10.zip, cl-lib-0.6.1.el,
julia-emacs-master.zip

The development version with the below patches and
others committed is available as a github clone and/
or download, the latter as ESS-master.zip. 

Looking at the release notes for emacs-24.3 it appears feasible to patch ess-16.10 to
run on Slackware 14.0 (or other Un*x distros) with emacs-24.2.

http://lists.gnu.org/archive/html/info-gnu-emacs/2013-03/msg00001.html

" ...An update for the Common Lisp emulation library."
" ...the changes in Emacs 24.3 are relatively minor."

https://ftp.gnu.org/gnu/emacs/
emacs-24.3.tar.gz

Read about the update.

bash-4.2# cd /tmp
bash-4.2# tar xf emacs-24.3.tar.gz
bash-4.2# grep -n "Common Lisp emulation" emacs-24.3/etc/NEWS
247:** Common Lisp emulation (CL)
bash-4.2#

bash-4.2# head -n 258 emacs-24.3/etc/NEWS | tail -12
** Common Lisp emulation (CL)

*** CL's main entry is now (require 'cl-lib).
`cl-lib' is like the old `cl' except that it uses the namespace cleanly;
i.e., all its definitions have the "cl-" prefix (and internal definitions
use the "cl--" prefix).

If `cl' provided a feature under the name `foo', then `cl-lib'
provides it under the name `cl-foo' instead; with the exceptions of the
few `cl' definitions that had to use `foo*' to avoid conflicts with
pre-existing Elisp entities.  These have been renamed to `cl-foo'
rather than `cl-foo*'.
bash-4.2#

Check for any new macros.

bash-4.2# grep "New macros" emacs-24.3/etc/NEWS
** New macros `setq-local' and `defvar-local'.
bash-4.2#

https://ess.r-project.org/
ess-16.10.zip

Download ess-16.10.zip, extract it, and move the directory.

bash-4.2# unzip ess-16.10.zip

...

bash-4.2# mv ess-16.10 /usr/share/emacs/site-lisp/ess
bash-4.2#

Check if ess-16.10 used cl-lib and the new macros.

bash-4.2# grep -r cl-lib /usr/share/emacs/site-lisp/ess/lisp
lisp/ess-r-syntax.el:(require 'cl-lib)
bash-4.2#

bash-4.2# grep -r defvar-local /usr/share/emacs/site-lisp/ess/lisp
lisp/ess-generics.el:      (defvar-local ,funname nil ,(format "When defined this function
 is called by `%s'." name))
lisp/ess-r-d.el:(defvar-local ess-r-evaluation-env nil
lisp/ess-r-d.el:(defvar-local ess-r--evaluation-env-mode-line
lisp/ess-r-package.el:(defvar-local ess-r-package-info nil
lisp/ess-tracebug.el:(defvar-local ess--dbg-mode-line-debug
lisp/ess-tracebug.el:(defvar-local ess--dbg-mode-line-error-action
lisp/ess-utils.el:(defvar-local ess-buffer-has-chunks nil
bash-4.2#

bash-4.2# grep -r setq-local /usr/share/emacs/site-lisp/ess/lisp
lisp/ess-help.el:  (if ess-mode-syntax-table ;;set in advance by ess-setq-local
lisp/ess-help.el:  (setq-local show-trailing-whitespace nil)
lisp/ess-inf.el:      (setq-local jit-lock-chunk-size inferior-ess-jit-lock-chunk-size))
lisp/ess-roxy.el:          (setq-local ess-buffer-has-chunks t)
lisp/ess-roxy.el:          (setq-local syntax-propertize-function #'ess-roxy-syntax-propertize)
lisp/ess-roxy.el:          (setq-local font-lock-fontify-region-function #'ess-roxy-fontify-region)
lisp/ess-roxy.el:          (setq-local font-lock-unfontify-region-function #'ess-roxy-unfontify-region)))
lisp/ess-roxy.el:    (setq-local syntax-propertize-function nil)
lisp/ess-roxy.el:    (setq-local font-lock-fontify-region-function nil)
lisp/ess-roxy.el:    (setq-local font-lock-unfontify-region-function nil)
lisp/ess-roxy.el:  (setq-local paragraph-start (concat "\\(" ess-roxy-re "\\)*"paragraph-start))
lisp/ess-roxy.el:  (setq-local paragraph-separate (concat "\\(" ess-roxy-re "\\)*" paragraph-separate))
lisp/ess-roxy.el:  (setq-local adaptive-fill-function 'ess-roxy-adaptive-fill-function))
bash-4.2#

bash-4.2# grep -r setq-local /usr/share/emacs/site-lisp/ess/test
test/ess-literate-tests.el:      (setq-local file-local-variables-alist (copy-alist local-variables))
test/literate/code-fill.R:##! (setq-local fill-column 40)
test/literate/code-fill.R:##! (setq-local fill-column 40)
test/literate/code-fill.R:##! (setq-local fill-column 42)
bash-4.2#

https://elpa.gnu.org/packages/cl-lib.html
cl-lib-0.6.1.el

Download cl-lib-0.6.1.el, rename it to cl-lib.el, create a byte-compiled version,
gzip cl-lib.el, and move the two files to /usr/share/emacs/24.2/lisp/emacs-lisp.

bash-4.2# mv cl-lib-0.6.1.el cl-lib.el
bash-4.2# emacs -batch -f batch-byte-compile cl-lib.el

In toplevel form:
cl-lib.el:74:1:Warning: cl package required at runtime
Wrote /tmp/cl-lib.elc
bash-4.2# gzip -n -9 cl-lib.el
bash-4.2# file cl-lib.el.gz
cl-lib.el.gz: gzip compressed data, from Unix, max compression
bash-4.2# mv cl-lib.el.gz /usr/share/emacs/24.2/lisp/emacs-lisp
bash-4.2# mv cl-lib.elc /usr/share/emacs/24.2/lisp/emacs-lisp
bash-4.2#

https://github.com/JuliaEditorSupport/julia-emacs
julia-emacs-master.zip

Download julia-emacs-master.zip, extract it, and move
julia-mode.el to /usr/share/emacs/site-lisp/ess/lisp.

bash-4.2# unzip julia-emacs-master.zip

...

bash-4.2# mv julia-emacs-master/julia-mode.el \
> /usr/share/emacs/site-lisp/ess/lisp
bash-4.2#

Patches committed on 10, 14, and 18 January 2017, respectively for a backwards
compatibility definition for defvar-local, allocation for pcase.el (emacs-24.2/24.1)
specifications, and a backward compatibility definition for setq-local; the macro
defines based on those found in the file emacs-24.3/lisp/subr.el.

10. jan. 2017 09.57 CET

diff --git a/lisp/ess-compat.el b/lisp/ess-compat.el
index 6910877..d706a34 100644
--- a/lisp/ess-compat.el
+++ b/lisp/ess-compat.el
@@ -1,6 +1,6 @@
 ;;; ess-compat.el --- simple determination of Emacs/XEmacs and version #.

-;; Copyright (C) 2000--2005 A.J. Rossini, Richard M. Heiberger, Martin
+;; Copyright (C) 2000--2017 A.J. Rossini, Richard M. Heiberger, Martin
 ;;      Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen.

 ;; Author: A.J. Rossini <rossini@biostat.washington.edu>
 @@ -278,6 +278,18 @@ mode is enabled.  Usually, such commands should use
 also checks the value of `use-empty-active-region'."
     (and transient-mark-mode mark-active)))

+;; for emacs <= 24.2 :
+(unless (fboundp 'defvar-local)
+  (defmacro defvar-local (var val &optional docstring)
+    "Define VAR as a buffer-local variable with default value VAL.
+Like `defvar' but additionally marks the variable as being automatically
+buffer-local wherever it is set."
+    (declare (debug defvar) (doc-string 3))
+    ;; Can't use backquote here, it's too early in the bootstrap.
+    (list 'progn (list 'defvar var val docstring)
+          (list 'make-variable-buffer-local (list 'quote var)))))
+
+
 (provide 'ess-compat)

   ; Local variables section

14. jan. 2017 20.37 CET

diff --git a/lisp/ess-r-syntax.el b/lisp/ess-r-syntax.el
index 4ac34f30..26ff7d18 100644
--- a/lisp/ess-r-syntax.el
+++ b/lisp/ess-r-syntax.el
@@ -189,7 +189,7 @@ Cons cell containing the token type and string representation."
 ;; backward
 (defun ess-climb-token--operator ()
   (when (pcase (char-before)
-          ((or ?+ ?/ ?^ ?~ ?? ?!)
+          ((or `?+ `?/ `?^ `?~ `?? `?!)
            (ess-backward-char))
           (`?=
            (prog1 (ess-backward-char)
 @@ -198,7 +198,7 @@ Cons cell containing the token type and string representation."
                  (ess-climb-token--char ?:)
                  (ess-climb-token--char ?>)
                  (ess-climb-token--char ?<))))
-          ((or ?& ?| ?* ?@ ?$)
+          ((or `?& `?| `?* `?@ `?$)
            (prog1 (ess-backward-char)
              (ess-climb-token--char (char-after))))
           (`?<
 @@ -364,7 +364,7 @@ reached."
   (let ((refined-type
          (pcase (ess-token-type token)
            ;; Parameter assignment
-           ("="
+           (`"="
             (save-excursion
               (goto-char (ess-token-start token))
               (let ((containing-sexp (ess-containing-sexp-position)))
 @@ -377,14 +377,14 @@ reached."
                                   (ess-token-before= '("," "(")))))
                   "param-assign"))))
            ;; Quoted identifiers
-           ("string"
+           (`"string"
             (when (or
                    ;; Quoted parameter names
                    (ess-refined-token= (ess-token-after) "param-assign")
                    ;; Quoted call names
                    (ess-token-after= "("))
               "identifier"))
-           ((or "(" ")")
+           ((or `"(" `")")
             (or (save-excursion
                   (if (ess-token-close-delimiter-p token)
                       (ess-climb-paired-delims nil token)
 @@ -397,7 +397,7 @@ reached."
                     (ess-climb-paired-delims ")" token)
                     (when (ess-token-before= '("identifier" "string" ")" "]" "]]" "}"))
                       "argslist-delimiter")))))
-           ((or "{" "}")
+           ((or `"{" `"}")
             (save-excursion
               (unless (ess-climb-paired-delims "}" token)
                 (goto-char (ess-token-start token)))

18. jan. 2017 11.32 CET

diff --git a/lisp/ess-compat.el b/lisp/ess-compat.el
index d706a34..175f8f2 100644
--- a/lisp/ess-compat.el
+++ b/lisp/ess-compat.el
@@ -289,6 +289,12 @@ buffer-local wherever it is set."
     (list 'progn (list 'defvar var val docstring)
           (list 'make-variable-buffer-local (list 'quote var)))))

+(unless (fboundp 'setq-local)
+  (defmacro setq-local (var val)
+    "Set variable VAR to value VAL in current buffer."
+    ;; Can't use backquote here, it's too early in the bootstrap.
+    (list 'set (list 'make-local-variable (list 'quote var)) val)))
+

 (provide 'ess-compat)

Cd'ing to the ess directory and running 'make' byte-compiled on the
patched ess-16.10 all relevent .el files, and 'make test' passed the 17
tests.

bash-4.2# cd /usr/share/emacs
bash-4.2# CWD=$(pwd)
bash-4.2# mkdir logs
bash-4.2# cd site-lisp/ess
bash-4.2# make >$CWD/logs/make_2017-01-19.log 2>&1
bash-4.2# make test>$CWD/logs/make_test_2017-01-19.log 2>&1
bash-4.2# tail -n3 $CWD/logs/make_test_2017-01-19.log

Ran 17 tests, 17 results as expected (2017-01-19 02:42:38+0100)

bash-4.2# exit

NB: If you have a network connection julia-mode.el will be automatically downloaded.

Installation of julia-0.3.12 (pre-compiled).

https://julialang.org/downloads/oldreleases.html
julia-0.3.12-linux-i686.tar.gz

http://slackbuilds.org/repository/14.2/development/julia/
julia.tar.gz

Modify A. Mascarenhas' .SlackBuild as follows.

- VERSION=${VERSION:-0.6.0}
+ VERSION=${VERSION:-0.3.12}
- VERSION_TAG=${VERSION_TAG:-903644385b}
+ VERSION_TAG=${VERSION_TAG:-80aa77986e}

- cat $CWD/$PRGNAM.info > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.info
# cat $CWD/$PRGNAM.info > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.info

bash-4.2# installpkg julia-0.3.12-i686-1_SBo.tgz

...

bash-4.2# exit

sh-4.2$ export EDITOR=ed
sh-4.2$ julia
               _
   _       _ _(_)_     |  A fresh approach to technical computing
  (_)     | (_) (_)    |  Documentation: http://docs.julialang.org
   _ _   _| |_  __ _   |  Type "help()" for help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 0.3.12 (2015-10-26 12:41 UTC)
 _/ |\__'_|_|_|\__'_|  |  Official http://julialang.org/ release
|__/                   |  i686-pc-linux-gnu

julia> Pkg.status()
INFO: Initializing package repository /home/eric/.julia/v0.3
INFO: Cloning METADATA from git://github.com/JuliaLang/METADATA.jl
No packages installed

julia> Pkg.add("DataFrames")
INFO: Cloning cache of ArrayViews from
 git://github.com/JuliaArrays/ArrayViews.jl.git
INFO: Cloning cache of Compat from 
 git://github.com/JuliaLang/Compat.jl.git
INFO: Cloning cache of DataArrays from
 git://github.com/JuliaStats/DataArrays.jl.git
INFO: Cloning cache of DataFrames from
 git://github.com/JuliaData/DataFrames.jl.git
INFO: Cloning cache of Docile from
 git://github.com/MichaelHatherly/Docile.jl.git
INFO: Cloning cache of GZip from 
 git://github.com/JuliaIO/GZip.jl.git
INFO: Cloning cache of Reexport from 
 git://github.com/simonster/Reexport.jl.git
INFO: Cloning cache of SortingAlgorithms from 
 git://github.com/JuliaCollections/SortingAlgorithms.jl.git
INFO: Cloning cache of StatsBase from
 git://github.com/JuliaStats/StatsBase.jl.git
INFO: Cloning cache of StatsFuns from 
 git://github.com/JuliaStats/StatsFuns.jl.git
INFO: Installing ArrayViews v0.6.4
INFO: Installing Compat v0.8.8
INFO: Installing DataArrays v0.2.20
INFO: Installing DataFrames v0.6.10
INFO: Installing Docile v0.5.23
INFO: Installing GZip v0.2.20
INFO: Installing Reexport v0.0.3
INFO: Installing SortingAlgorithms v0.0.6
INFO: Installing StatsBase v0.7.4
INFO: Installing StatsFuns v0.2.2
INFO: Package database updated
INFO: METADATA is out-of-date — you may not have the latest version of DataFrames
INFO: Use `Pkg.update()` to get the latest versions of your packages

julia> Pkg.update()
INFO: Updating METADATA...
INFO: Computing changes...
INFO: No packages to install, update or remove

julia> Pkg.add("RDatasets")
INFO: Cloning cache of RDatasets from 
 git://github.com/johnmyleswhite/RDatasets.jl.git
INFO: Installing RDatasets v0.1.3
INFO: Package database updated

julia> quit()
sh-4.2$ exit

NB: You must have a value for $EDITOR or $VISUAL or else Pkg.add("pkg") will not work.

Installation of R-3.0.1.

R and BLAS shared libraries are built running the .SlackBuild absent any added variables.

You can modify the .SlackBuild to use a newer version number but info or html versions of the R manual cannot be built for >R-3.1.3; texi2any v5.1 being added as a prerequisite for their compile in R-3.2.0. R furthermore requires inconsolata.sty or zi4.sty (the inconsolata package) to optimally render the PDF vignettes and package manuals, if you really need those files consider removing Slackware's tetex and installing tex-live.

http://mirrors.dotsrc.org/cran/src/base/R-3/
R-3.0.1.tar.gz

http://slackbuilds.org/repository/14.0/academic/R/
R.tar.gz

bash-4.2# installpkg R-R-3.0.1-i486-1_SBo.tgz

...

bash-4.2# exit

[   ]