From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: "Pascal J. Bourguignon" Newsgroups: gmane.emacs.help Subject: Re: use Elisp to improve your Elisp - some code issues Date: Sat, 01 Aug 2015 10:54:22 +0200 Organization: Informatimago Message-ID: <87twsjv16p.fsf@kuiper.lan.informatimago.com> References: <877fphvymu.fsf@kuiper.lan.informatimago.com> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Trace: ger.gmane.org 1438419323 6374 80.91.229.3 (1 Aug 2015 08:55:23 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Sat, 1 Aug 2015 08:55:23 +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 Aug 01 10:55:19 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 1ZLSZZ-0001NU-Id for geh-help-gnu-emacs@m.gmane.org; Sat, 01 Aug 2015 10:55:17 +0200 Original-Received: from localhost ([::1]:47121 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZLSZY-0008Q2-ON for geh-help-gnu-emacs@m.gmane.org; Sat, 01 Aug 2015 04:55:16 -0400 Original-Path: usenet.stanford.edu!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail Original-Newsgroups: gnu.emacs.help Original-Lines: 45 Original-X-Trace: individual.net 4++NgRQX+VGu1zGXYqzRHwx0rK5Cnxdb5o1X4EE1A6yTtYrvrF Cancel-Lock: sha1:MWY1YzFiM2ZlZDg5OTNlMmMyNWM1ODU0N2E2NjdjYmFlNTNhNjdjMQ== sha1:yAQkXYK2J3NOqzmSZsJ3ZElDJUA= Face: iVBORw0KGgoAAAANSUhEUgAAADAAAAAwAQMAAABtzGvEAAAABlBMVEUAAAD///+l2Z/dAAAA oElEQVR4nK3OsRHCMAwF0O8YQufUNIQRGIAja9CxSA55AxZgFO4coMgYrEDDQZWPIlNAjwq9 033pbOBPtbXuB6PKNBn5gZkhGa86Z4x2wE67O+06WxGD/HCOGR0deY3f9Ijwwt7rNGNf6Oac l/GuZTF1wFGKiYYHKSFAkjIo1b6sCYS1sVmFhhhahKQssRjRT90ITWUk6vvK3RsPGs+M1RuR mV+hO/VvFAAAAABJRU5ErkJggg== X-Accept-Language: fr, es, en User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux) Original-Xref: usenet.stanford.edu gnu.emacs.help:213897 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:106182 Archived-At: Emanuel Berg writes: > ;; find the construct (if a a b) if you want to replace it with (or a b) > ;; if it works, when applied to this file, it should find the example above! > (search-regexp-in-files (buffer-file-name) > "([[:space:]\n]*if[[:space:]\n]+\\(.*\\)[[:space:]\n]+\\1[[:space:]\n]+\\(.*\\))" Perhaps you have notied some discrepancy here. Check: https://en.wikipedia.org/wiki/Chomsky_hierarchy You may use read, or forward-sexp / backward-sexp and down-lisp / up-list, to walk the sexps of the buffer in such a way that now you can check for source patterns instead of text patterns. Not that in this case you may want to use it, but it might still be better to write: (map-sexp-in-files (lambda (form) (cond ((atom form) form) ((and (eql (first form) 'if) (eql (second form) (third form))) ; eql ensures we don't ;; substitute expressions that may have side effects. `(or ,(second form) ,@(cdddr form))) (t form))) (list (buffer-file-name))) or: (require 'pjb-pmatch) (map-sexp-in-files (lambda (form) (match-case form ((if (!v a) (!v a) (!! (!x e))) `(or ,a ,e)) (otherwise form))) (list (buffer-file-name))) -- __Pascal Bourguignon__ http://www.informatimago.com/ “The factory of the future will have only two employees, a man and a dog. The man will be there to feed the dog. The dog will be there to keep the man from touching the equipment.” -- Carl Bass CEO Autodesk