From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Barry Margolin Newsgroups: gmane.emacs.help Subject: Re: ~`symbol-function' to get code as list even when byte-compiled? Date: Sun, 24 May 2015 22:58:18 -0400 Organization: A noiseless patient Spider Message-ID: References: <877frxid14.fsf@debian.uxu> NNTP-Posting-Host: plane.gmane.org X-Trace: ger.gmane.org 1432523276 1215 80.91.229.3 (25 May 2015 03:07:56 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Mon, 25 May 2015 03:07:56 +0000 (UTC) To: help-gnu-emacs@gnu.org Original-X-From: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Mon May 25 05:07:52 2015 Return-path: Envelope-to: geh-help-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1Ywik3-0006B9-1Y for geh-help-gnu-emacs@m.gmane.org; Mon, 25 May 2015 05:07:51 +0200 Original-Received: from localhost ([::1]:41719 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Ywik2-0006oB-2Q for geh-help-gnu-emacs@m.gmane.org; Sun, 24 May 2015 23:07:50 -0400 Original-Path: usenet.stanford.edu!news.kjsl.com!feeder.erje.net!1.eu.feeder.erje.net!eternal-september.org!feeder.eternal-september.org!mx02.eternal-september.org!barmar.motzarella.org!.POSTED!not-for-mail Original-Newsgroups: gnu.emacs.help Original-Lines: 76 Injection-Info: barmar.motzarella.org; posting-host="2be9e9f5dd9af768b8861af71b85fc28"; logging-data="27463"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX19D5/ADYovYVPOGZFadiOg0" User-Agent: MT-NewsWatcher/3.5.3b3 (Intel Mac OS X) Cancel-Lock: sha1:P8FEXNSdReR0Iyi4K3Z0UOPnp1c= Original-Xref: usenet.stanford.edu gnu.emacs.help:212266 X-BeenThere: help-gnu-emacs@gnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: Users list for the GNU Emacs text editor List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Original-Sender: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.help:104550 Archived-At: In article <877frxid14.fsf@debian.uxu>, Emanuel Berg wrote: > (re-search-forward "^Question") > > Here is some interesting code. What's interesting is: > when this code executes, it changes itself, i.e. > the code changes the code! > > But it isn't a macro which is a program that produces > a new program based on its own logic and non-evaluated > input data. > > On the contrary, here we deal all with ordinary > functions (defuns) where one changes the other. > Does that always happen? No - only when it is needed! > > See the entire code here [1]. Go there if you want to > see this in execution as it probably is based on some > other functions as well. The below code is for display > purposes ONLY! > > Question: this is all working thanks to > `symbol-function' which is used to get the code of the > function as data, so it can be examined and > manipulated. However, if I byte-compile the code > (which I always do), `symbol-function' doesn't return > a lambda function which is also a list, but instead > just a function #[...] which isn't a list. So then it > doesn't work! > > I was able to do a workaround with `load-file' in > .emacs to get all the functions in the file in > evaluated form. But, can I do that specifically for > a named function, *or*, can I extract the code in list > format somehow even if compiled? You can probably prevent it from being compiled, maybe something like: (setf (symbol-function 'number-one-jump) '(lambda (&optional not-used) ...)) But can't you do something equivalent by using advice instead of self-modifying code? > > (symbol-function jump) > > (defun enable-jump (jump) > (add-hook 'w3m-display-hook jump) > (let*((code (symbol-function jump)) > (remove-code `(remove-hook 'w3m-display-hook (quote ,jump))) > (remove-code-index 2) > (current-code (nth remove-code-index code)) ) > (unless (equal current-code remove-code) > (push remove-code (nthcdr remove-code-index code)) ))) > > (defun web-search () > (interactive) > (let ((search (get-search-string "Google"))) > (unless (empty-string-p search) > (w3m-new-tab (format "Google: %s" search)) > (w3m-search w3m-search-default-engine search) )) > (enable-jump 'number-one-jump) ) > > (defun number-one-jump (&optional not-used) ; Google, Youtube > (when (re-search-forward "^ 1." (point-max) t) > (recenter-top-bottom 0) > (w3m-next-anchor) )) > > [1] http://user.it.uu.se/~embe8573/conf/emacs-init/w3m/w3m-unisearch.el -- Barry Margolin, barmar@alum.mit.edu Arlington, MA *** PLEASE post questions in newsgroups, not directly to me ***