/usr/share/emacs/site-lisp/gcl/gcl.el is in gcl 2.6.12-47.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 | ;; Copyright William F. Schelter. 1994
;; Licensed by GNU public license.
;; You should copy isp-complete.el to the emacs/lisp directory.
;; Some commands and macros for dealing with lisp
;; M-X run : run gcl or another lisp
;; m-c-x ; evaluate defun in the other window or in the last lisp which you were using.
;; m-c-x ; with a numeric arg : compile the current defun in the other window
;; m-c-d ; disassemble in other window.
;; M-x macroexpand-next : macro expand the next sexp in other window.
;; C-h d Find documentation on symbol where the cursor is.
;; C-h / Find documentation on all strings containing a given string.
;; M-p complete the current input by looking back through the buffer to see what was last typed
;; using this prompt and this beginning. Useful in shell, in lisp, in gdb,...
(setq lisp-mode-hook 'remote-lisp)
(autoload 'lisp-complete "lisp-complete" nil t)
(autoload 'smart-complete "smart-complete" nil t)
;(global-set-key "p" 'lisp-complete)
(global-set-key "p" 'smart-complete)
(defun remote-lisp (&rest l)
(and (boundp 'lisp-mode-map)
lisp-mode-map
(progn
(define-key lisp-mode-map "\e\C-d" 'lisp-send-disassemble)
(define-key lisp-mode-map "\e\C-x" 'lisp-send-defun-compile)
(make-local-variable 'lisp-package)
(setq lisp-package nil)
(and (boundp 'remote-lisp-hook) (funcall remote-lisp-hook))
)))
(defvar search-back-for-lisp-package-p nil)
;; look at the beginning of buffer to try to find an in package statement
(defun get-buffer-package ()
"Returns what it thinks is the lisp package for the current buffer.
It caches this information in the local variable `lisp-package'. It
obtains the information from searching for the first in-package from
the beginning of the file. Since in common lisp, there is only
supposed to be one such statement, it should be able to determine
this. By setting lisp-package to t, you may disable its search. This
will also disable the automatic inclusion of an in-package statement
in the tmp-lisp-file, used for sending forms to the current
lisp-process."
(cond ((eq lisp-package t) nil)
(search-back-for-lisp-package-p
(save-excursion
(cond ((re-search-backward "^[ \t]*(in-package " nil t)
(goto-char (match-end 0))
(read (current-buffer))))))
(lisp-package lisp-package)
(t
(setq
lisp-package
(let (found success)
(save-excursion
(goto-char (point-min))
(while (not found)
(if (and (setq success (search-forward "(in-package " 1000 t))
(not (save-excursion
(beginning-of-line)
(looking-at "[ \t]*;"))))
(setq found (read (current-buffer))))
(if (>= (point) 980) (setq found t))
(or success (setq found t))
))
found)))))
(defun run (arg)
"Run an inferior Lisp process, input and output via buffer *lisp*."
(interactive "sEnter name of file to run: ")
(require 'sshell)
;; in emacs 19 uncomment:
;;(require 'inf-lisp)
(setq lisp-mode-hook 'remote-lisp)
(switch-to-buffer (make-sshell (concat arg "-lisp") arg nil "-i"))
(make-local-variable 'shell-prompt-pattern)
(setq sshell-prompt-pattern "^[^#%)>]*[#%)>]+ *")
(cond ((or (string-match "maxima" arg) (string-match "affine" arg)
(save-excursion (sleep-for 2)
(re-search-backward "maxima"
(max 1 (- (point) 300))
t)))
(require 'maxima-mode)
(inferior-maxima-mode)
(goto-char (point-max))
)
(t
(if (boundp 'inferior-lisp-mode)
(inferior-lisp-mode)
(funcall lisp-mode-hook))
)))
(defun lisp-send-disassemble (arg)
(interactive "P")
(if arg
( lisp-send-defun-compile "disassemble-h")
( lisp-send-defun-compile "disassemble"))
)
(defvar time-to-throw-away nil)
(defvar telnet-new-line "")
(defun lisp-send-defun-compile (arg)
"Send the current defun (or other form) to the lisp-process. If there
is a numeric arg, the form (compile function-name) is also sent. The
value of lisp-process will be the process of the other exposed window (if
there is one) or else the global value of lisp-process. If the
...received message is not received, probably either the reading of
the form caused an error. If the process does not have telnet in
its name, then we write a tmp file and load it.
If :sdebug is in *features*, then si::nload is used instead of
ordinary load, in order to record line information for debugging.
The value of `lisp-package' if non nil, will be used in putting an
in-package statement at the front of the tmp file to be loaded.
`lisp-package' is determined automatically on a per file basis,
by get-buffer-package.
"
(interactive "P")
(other-window 1)
(let* ((proc (or (get-buffer-process (current-buffer)) lisp-process))
def beg
(this-lisp-process proc)
(lisp-buffer (process-buffer this-lisp-process))
fun)
(other-window 1)
(save-excursion
(end-of-defun)
(let ((end (dot)) (buffer (current-buffer))
(proc (get-process this-lisp-process)))
(setq lisp-process proc)
(beginning-of-defun)
(save-excursion
(cond ((and arg (looking-at "(def")) (setq def t))
(t (setq arg nil)))
(cond (def (forward-char 2)(forward-sexp 1)
(setq fun (read buffer))
(setq fun (prin1-to-string fun))
(message (format
"For the lisp-process %s: %s"
(prin1-to-string this-lisp-process) fun)))))
(cond ((equal (char-after (1- end)) ?\n)
(setq end (1- end)) ))
(setq beg (dot))
(my-send-region this-lisp-process beg end)
))
(send-string this-lisp-process
(concat ";;end of form" "\n" telnet-new-line))
(cond (arg
(if (numberp arg) (setq arg "compile"))
(send-string this-lisp-process (concat "(" arg "'" fun ")"
telnet-new-line))))
(and time-to-throw-away
(string-match "telnet"(buffer-name (process-buffer proc)))
(dump-output proc time-to-throw-away))
(cond (nil ;(get-buffer-window lisp-buffer)
(select-window (get-buffer-window lisp-buffer))
(goto-char (point-max)))
(t nil))))
(fset 'lisp-eval-defun (symbol-function 'lisp-send-defun-compile))
(defvar telnet-new-line "")
(defvar tmp-lisp-file (concat "/tmp/" (user-login-name) ".lsp"))
(defun get-buffer-clear (name)
(let ((cb (current-buffer))
(buf (get-buffer-create name)))
(set-buffer buf)
(erase-buffer)
(set-buffer cb)
buf))
(defmacro my-with-output-to-temp-buffer (name &rest body)
(append (list
'let
(list (list 'standard-output (list 'get-buffer-clear name))))
body))
(defun my-send-region (proc beg end)
(cond ((or (string-match "telnet" (process-name proc)))
(send-region proc beg end))
(t
(let ((package (get-buffer-package)))
(save-excursion
(my-with-output-to-temp-buffer "*tmp-gcl*"
(if (and package (not (eq package t)))
(prin1 (list 'in-package package)))
(princ ";!(:line ")
(prin1
(let ((na (buffer-file-name (current-buffer))))
(if na (expand-file-name na)
(buffer-name (current-buffer))))
)
(princ (- (count-lines (point-min) (+ beg 5)) 1))
(princ ")\n")
(set-buffer "*tmp-gcl*")
(write-region (point-min) (point-max) tmp-lisp-file nil nil)))
(write-region beg end tmp-lisp-file t nil)
(message "sending ..")
(send-string
proc
(concat "(lisp::let ((*load-verbose* nil)) (#+sdebug si::nload #-sdebug load \""
tmp-lisp-file
"\")#+gcl(setq si::*no-prompt* t)(values))\n ")
)
(message (format "PACKAGE: %s ..done"
(if (or (not package) (eq package t))
"none"
package)))
))))
(defun dump-output (proc seconds)
"dump output for PROCESS for SECONDS or to \";;end of form\""
(let ((prev-filter (process-filter proc)) (already-waited 0))
(unwind-protect (progn (set-process-filter proc 'dump-filter)
(while (< already-waited seconds)
(sleep-for 1)(setq already-waited
(1+ already-waited))))
(set-process-filter proc prev-filter))))
(defun dump-filter (proc string)
; (setq she (cons string she))
(let ((ind (string-match ";;end of form" string)))
(cond (ind (setq string (substring
string
(+ ind (length
";;end of form"))))
(message "... received.")
(setq already-waited 1000)
(set-process-filter proc prev-filter)
(cond (prev-filter (funcall prev-filter proc string))
(t string)))
(t ""))))
;;(process-filter (get-process "lisp"))
(defun macroexpand-next ()
"macroexpand current form"
(interactive)
(save-excursion
(let ((beg (point)))
(forward-sexp )
(message "sending macro")
(let* ((current-lisp-process
(or (get-buffer-process (current-buffer))
(prog2 (other-window 1)
(get-buffer-process (current-buffer))
(other-window 1)))))
(send-string current-lisp-process "(macroexpand '")
(send-region current-lisp-process beg (point) )
(send-string current-lisp-process ")\n")))))
(defun delete-comment-char (arg)
(while (and (> arg 0) (looking-at comment-start)) (delete-char 1)
(setq arg (1- arg))))
(defun mark-long-comment ()
(interactive)
(let ((at (point)))
(beginning-of-line)
(while(and (not (eobp))
(or (looking-at comment-start)
;(looking-at "[ ]*\n")
))
(forward-line 1))
(set-mark (point))
(goto-char at)
(while(and (not (bobp))
(or (looking-at comment-start)
;(looking-at "[ ]*\n")
))
(forward-line -1))
(or (bobp )(forward-line 1))))
(defun fill-long-comment ()
(interactive)
(mark-long-comment)
(let ((beg (min (dot) (mark)))
(end (max (dot) (mark))) (n 0)m)
(narrow-to-region beg end)
(goto-char (point-min))
(while (looking-at ";")
(forward-char 1))
(setq n (- (point) beg))
(goto-char (point-min))
(while (not (eobp))
(setq m n)
(while (> m 0)
(cond ((looking-at ";")
(delete-char 1)
(cond ((looking-at " ")(delete-char 1)(setq m 0)))
(setq m (- m 1)))
(t (setq m 0))))
(forward-line 1))
(fill-region (dot-min) (dot-max))
(goto-char (point-min))
(while (not (eobp))
(cond ((looking-at "\n")
nil)
(t(insert ";; ")))
(forward-line 1))
(goto-char (point-min))
(set-mark (point-max))
(widen)))
(defun comment-region (arg)
"Comments the region, with a numeric arg deletes up to arg comment
characters from the beginning of each line in the region. The region stays,
so a second comment-region adds another comment character"
(interactive "P")
(save-excursion
(let ((beg (dot))
(ok t)(end (mark)))
(comment-region1 beg end arg))))
(defun comment-region1 (beg end arg)
(let ((ok t))
(cond((> beg end)
(let ((oth end))
(setq end beg beg oth))))
(narrow-to-region beg end)
(goto-char beg)
(unwind-protect
(while ok
(cond (arg
(delete-comment-char arg))
(t (insert-string comment-start)))
(if (< end (dot)) (setq ok nil)
(if (search-forward "\n" end t) nil (setq ok nil))) )
(widen))))
(defun trace-expression ()
(interactive)
(save-excursion
(forward-sexp )
(let ((end (point)))
(forward-sexp -1)
(other-window 1)
(let* ((proc (get-buffer-process (current-buffer)))
(current-lisp-process (or proc lisp-process)))
(other-window 1)
(message "Tracing: %s" (buffer-substring (point) end))
(send-string current-lisp-process "(trace ")
(send-region current-lisp-process (point) end)
(send-string current-lisp-process ")\n")))))
(defun gcl-mode ()
(interactive)
(lisp-mode)
)
(provide 'gcl)
|