From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Jean Louis Newsgroups: gmane.emacs.help Subject: Re: FW: [External] : Re: Is there symbol-plist functionality in Emacs Lisp? Date: Sat, 8 May 2021 19:23:35 +0300 Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="12126"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Mutt/2.0.6 (2021-03-06) Cc: "Help-Gnu-Emacs \(help-gnu-emacs@gnu.org\)" , Stefan Monnier To: Drew Adams Original-X-From: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane-mx.org@gnu.org Sat May 08 18:29:35 2021 Return-path: Envelope-to: geh-help-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1lfPpe-00030d-TJ for geh-help-gnu-emacs@m.gmane-mx.org; Sat, 08 May 2021 18:29:34 +0200 Original-Received: from localhost ([::1]:49860 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lfPpd-0000dg-B3 for geh-help-gnu-emacs@m.gmane-mx.org; Sat, 08 May 2021 12:29:33 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:34386) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lfPoz-0000dX-3M for help-gnu-emacs@gnu.org; Sat, 08 May 2021 12:28:53 -0400 Original-Received: from stw1.rcdrun.com ([217.170.207.13]:60997) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lfPot-0005Ce-DJ for help-gnu-emacs@gnu.org; Sat, 08 May 2021 12:28:52 -0400 Original-Received: from localhost ([::ffff:102.84.101.70]) (AUTH: PLAIN securesender, TLS: TLS1.3,256bits,ECDHE_RSA_AES_256_GCM_SHA384) by stw1.rcdrun.com with ESMTPSA id 00000000000ABF29.000000006096BC39.00004490; Sat, 08 May 2021 09:28:37 -0700 Mail-Followup-To: Drew Adams , "Help-Gnu-Emacs (help-gnu-emacs@gnu.org)" , Stefan Monnier Content-Disposition: inline In-Reply-To: Received-SPF: pass client-ip=217.170.207.13; envelope-from=bugs@gnu.support; helo=stw1.rcdrun.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: help-gnu-emacs@gnu.org X-Mailman-Version: 2.1.23 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-mx.org@gnu.org Original-Sender: "help-gnu-emacs" Xref: news.gmane.io gmane.emacs.help:129572 Archived-At: * Drew Adams [2021-05-08 17:39]: > As for how to get the function def, the answer > is `symbol-function', AFAIK. That is it. (symbol-function 'rcd-markdown) ⇒ (closure (t) (text) "Markdown processing" (if text (rcd-command-output-from-input "markdown" text) "")) I see what it means in the manual: ,---- | Currently, an Emacs Lisp closure object is represented by a list with | the symbol ‘closure’ as the first element, a list representing the | lexical environment as the second element, and the argument list and | body forms as the remaining elements: | | ;; lexical binding is enabled. | (lambda (x) (* x x)) | ⇒ (closure (t) (x) (* x x)) `---- If not defined under lexical scoping it looks like: (symbol-function 'myfn) ⇒ (lambda (a) a) Thank you, yhat is good enough, as it is list and I can, under conditions, change it to become able to save the function. It serves tracking of some unused and soon to be deleted functions. (defun save-function (f) (let* ((fun (symbol-function f)) (type (car fun))) (cond ((eq type 'lambda) (setq fun (append (list 'defun f) (cdr fun)))) ((eq type 'closure) (setq fun (append (list 'defun f) (nthcdr 2 fun))))) ;; save to file comes here fun)) (defun myfn (a) (+ 2 2 a)) (save-function 'myfn) ⇒ (defun myfn (a) (+ 2 2 a)) (save-function 'rcd-markdown) ⇒ (defun rcd-markdown (text) "Markdown processing" (if text (rcd-command-output-from-input "markdown" text) "")) (defun string-to-file-force (string file) "Prints string into file, matters not if file exists. Returns FILE as file name." (with-temp-file file (insert string)) file) Then now I can save at least those functions defined by myself, it serves my long term introspection, and preservation of single, from file deleted functions. (defun save-function () (interactive) (let ((function (function-called-at-point))) (when (and (symbolp function) (y-or-n-p (format "Save `%s'" (symbol-name function)))) (let* ((fun (symbol-function function)) (type (car fun)) (file (concat "/tmp/function-" (symbol-name function) ".el"))) (cond ((eq type 'lambda) (setq fun (append (list 'defun function) (cdr fun)))) ((eq type 'closure) (setq fun (append (list 'defun function) (nthcdr 2 fun))))) (message (string-to-file-force (prin1-to-string fun) file)))))) (define-key emacs-lisp-mode-map (kbd "") 'save-function) It gives output like this, that is acceptable: (defun save-function nil (interactive) (let (#'(function-called-at-point)) (if (and (symbolp function) (y-or-n-p (format "Save `%s'" (symbol-name function)))) (progn (let* ((fun (symbol-function function)) (type (car fun)) (file (concat "/tmp/function-" (symbol-name function) ".el"))) (cond ((eq type 'lambda) (setq fun (append (list 'defun function) (cdr fun)))) ((eq type 'closure) (setq fun (append (list 'defun function) (nthcdr 2 fun))))) (message (string-to-file-force (prin1-to-string fun) file))))))) -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns Sign an open letter in support of Richard M. Stallman https://stallmansupport.org/ https://rms-support-letter.github.io/