From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Tassilo Horn Newsgroups: gmane.emacs.help Subject: Re: elisp help: Getting the current word position. (closure?) Date: Sat, 31 May 2008 18:06:17 +0200 Message-ID: <877idav4p2.fsf@baldur.tsdh.de> References: <693cc531-de12-476c-b82e-642d6e5910d0@u12g2000prd.googlegroups.com> NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: ger.gmane.org 1212250110 15093 80.91.229.12 (31 May 2008 16:08:30 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Sat, 31 May 2008 16:08:30 +0000 (UTC) To: help-gnu-emacs@gnu.org Original-X-From: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Sat May 31 18:09:10 2008 Return-path: Envelope-to: geh-help-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.50) id 1K2Tdl-0000Mn-Rg for geh-help-gnu-emacs@m.gmane.org; Sat, 31 May 2008 18:09:10 +0200 Original-Received: from localhost ([127.0.0.1]:37661 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1K2Td0-0006P8-0X for geh-help-gnu-emacs@m.gmane.org; Sat, 31 May 2008 12:08:22 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1K2TbI-0005hs-3D for help-gnu-emacs@gnu.org; Sat, 31 May 2008 12:06:36 -0400 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1K2TbH-0005gs-2t for help-gnu-emacs@gnu.org; Sat, 31 May 2008 12:06:35 -0400 Original-Received: from [199.232.76.173] (port=56419 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1K2TbG-0005gg-Sh for help-gnu-emacs@gnu.org; Sat, 31 May 2008 12:06:34 -0400 Original-Received: from main.gmane.org ([80.91.229.2]:38652 helo=ciao.gmane.org) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1K2TbG-0005fd-4X for help-gnu-emacs@gnu.org; Sat, 31 May 2008 12:06:34 -0400 Original-Received: from list by ciao.gmane.org with local (Exim 4.43) id 1K2Tb9-0002GP-GE for help-gnu-emacs@gnu.org; Sat, 31 May 2008 16:06:27 +0000 Original-Received: from p54af3a20.dip0.t-ipconnect.de ([84.175.58.32]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Sat, 31 May 2008 16:06:27 +0000 Original-Received: from tassilo by p54af3a20.dip0.t-ipconnect.de with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Sat, 31 May 2008 16:06:27 +0000 X-Injected-Via-Gmane: http://gmane.org/ Original-Lines: 80 Original-X-Complaints-To: usenet@ger.gmane.org X-Gmane-NNTP-Posting-Host: p54af3a20.dip0.t-ipconnect.de User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.0.60 (gnu/linux) Cancel-Lock: sha1:pF8jqfnh3qzwxDjLJD+h8QortYM= X-detected-kernel: by monty-python.gnu.org: Linux 2.6, seldom 2.4 (older, 4) X-BeenThere: help-gnu-emacs@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Users list for the GNU Emacs text editor List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Errors-To: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.help:54387 Archived-At: cinsk writes: Hi! > (defun current-word-markers (&optional STRICT REALLY-WORD) > "Return the position of the current word" > (let ((old (symbol-function > 'buffer-substring-no-properties)) > (saved-start (make-marker)) > (saved-end (make-marker)) ret) > > (fset 'buffer-substring-no-properties > (lambda (start end) > (let (ret) > (set-marker saved-start start) > (set-marker saved-end end) > (setq ret (funcall old start end)) > ret))) > (setq ret (current-word STRICT REALLY-WORD)) > (fset 'buffer-substring-no-properties old) > (if ret > (cons saved-start saved-end) > nil))) > > > This function works. With my short knowledge of LISP, I think the > (lambda ...) form in `current-word-markers' is a closure, since it > refers to the unbound variables (saved-start and saved-end). Due to emacs' dynamic scoping they're bound when this function is called. Dynamic scoping basically means that a function can see all variables its caller defined (recursively). Here's an example: --8<---------------cut here---------------start------------->8--- (defun foo () (let ((foo-val "I'm a local variable of foo!")) (bar))) (defun bar () foo-val) (foo) ;; C-x C-e ==> "I'm a local variable of foo!" --8<---------------cut here---------------end--------------->8--- > Recently, I found that Emacs Lisp does not have "closures" according > to "GNU Emacs Lisp Reference Manual 2.8". Yes, that's true. > Here are a few questions: > > 1. Does the (lambda ...) in `current-word-markers' is a closure??? No. > 3. If not, enlighten me what is a closure. This real closure won't work in elisp: --8<---------------cut here---------------start------------->8--- (defun make-adder (n) (lambda (m) (+ n m))) (fset 'adder (make-adder 3)) (adder 3) ;; C-x C-e ==> Debugger entered--Lisp error: (void-variable n) (+ n m) adder(3) eval((adder 3)) eval-last-sexp-1(nil) eval-last-sexp(nil) call-interactively(eval-last-sexp nil nil) --8<---------------cut here---------------end--------------->8--- Bye, Tassilo -- Richard Stallman can coerce meaningful data from /dev/null.