From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Stefan Monnier Newsgroups: gmane.emacs.bugs Subject: bug#18643: 25.0.50; elisp--expect-function-p Date: Fri, 10 Oct 2014 09:20:13 -0400 Message-ID: References: <86oatmq7lc.fsf@yandex.ru> <543753AC.3090604@yandex.ru> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain X-Trace: ger.gmane.org 1412947290 26174 80.91.229.3 (10 Oct 2014 13:21:30 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Fri, 10 Oct 2014 13:21:30 +0000 (UTC) Cc: Leo Liu , 18643@debbugs.gnu.org To: Dmitry Gutov Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Fri Oct 10 15:21:23 2014 Return-path: Envelope-to: geb-bug-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 1Xca8H-0001FZ-SC for geb-bug-gnu-emacs@m.gmane.org; Fri, 10 Oct 2014 15:21:22 +0200 Original-Received: from localhost ([::1]:48126 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xca8H-0002hi-9G for geb-bug-gnu-emacs@m.gmane.org; Fri, 10 Oct 2014 09:21:21 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:50499) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xca87-0002hY-64 for bug-gnu-emacs@gnu.org; Fri, 10 Oct 2014 09:21:18 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Xca7y-0001ol-Ra for bug-gnu-emacs@gnu.org; Fri, 10 Oct 2014 09:21:11 -0400 Original-Received: from debbugs.gnu.org ([140.186.70.43]:48222) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xca7y-0001oh-ON for bug-gnu-emacs@gnu.org; Fri, 10 Oct 2014 09:21:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.80) (envelope-from ) id 1Xca7y-0001C9-Dp for bug-gnu-emacs@gnu.org; Fri, 10 Oct 2014 09:21:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Stefan Monnier Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Fri, 10 Oct 2014 13:21:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 18643 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: Original-Received: via spool by 18643-submit@debbugs.gnu.org id=B18643.14129472174522 (code B ref 18643); Fri, 10 Oct 2014 13:21:02 +0000 Original-Received: (at 18643) by debbugs.gnu.org; 10 Oct 2014 13:20:17 +0000 Original-Received: from localhost ([127.0.0.1]:39786 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1Xca7E-0001Ar-D4 for submit@debbugs.gnu.org; Fri, 10 Oct 2014 09:20:17 -0400 Original-Received: from ironport2-out.teksavvy.com ([206.248.154.181]:63119) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1Xca7C-0001Aj-GL for 18643@debbugs.gnu.org; Fri, 10 Oct 2014 09:20:14 -0400 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AucGAIDvNVNFxKjo/2dsb2JhbABZgwaDSrw0e4MOgRcXdIIlAQEBAQIBViMFCwsOJhIUGA0kiAQI0hkXjiNXB4Q4BJRilDeBaoNMIYEt X-IPAS-Result: AucGAIDvNVNFxKjo/2dsb2JhbABZgwaDSrw0e4MOgRcXdIIlAQEBAQIBViMFCwsOJhIUGA0kiAQI0hkXjiNXB4Q4BJRilDeBaoNMIYEt X-IronPort-AV: E=Sophos;i="4.97,753,1389762000"; d="scan'208";a="93785714" Original-Received: from 69-196-168-232.dsl.teksavvy.com (HELO pastel.home) ([69.196.168.232]) by ironport2-out.teksavvy.com with ESMTP/TLS/DHE-RSA-AES256-SHA; 10 Oct 2014 09:20:13 -0400 Original-Received: by pastel.home (Postfix, from userid 20848) id 4D83985E6; Fri, 10 Oct 2014 09:20:13 -0400 (EDT) In-Reply-To: <543753AC.3090604@yandex.ru> (Dmitry Gutov's message of "Fri, 10 Oct 2014 07:34:04 +0400") User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.4.50 (gnu/linux) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 140.186.70.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:94380 > I'm glad that you think this approach will work. Sounds like then the code > will just have to handle a fixed number of forms, which is solvable. I'm not sure it will, but experience seems to indicate that it works well for local variables, so there's hope. > Now I just have to wrap my head around `elisp--local-variables'. :) It's very simple: It takes the string between the first opening paren and point, appends a special symbol (the witness) followed by the number of missing closing parens to make the whole string a valid sexp, than reads¯oexpands that. And then we traverse the expanded code (a tree) straight from the root to the leaf corresponding to point (which is done in elisp--local-variables-1), collecting various info along the way. Of course, traversing the tree efficiently is hard/impossible because we don't know for sure where is the witness (which represents point) in the tree, so we'd have to go through all the nodes of the tree, whereas we want to limit ourselves to going down from the root straight to the right leaf without backtracking. Luckily, we know that point started "at the very end" of the sexp, and macroexpansion tends to preserve the order, so if we always follow "the rightmost child", we often find the witness. Of course, it doesn't always work: e.g. if we start from (with-foo witness), we'll generally end up with a macro-expanded code of the form (unwind-protect (progn (something) witness) (somethingelse)) and going down the rightmost child won't find the witness. Maybe we could/should do a full backtracking traversal of the whole tree instead, so it works more often. After all, we use macroexpand-all already, so we do perform such a traversal elsewhere anyway (and we don't really have to: we could perform the macroexpansion only along the spine we descend). Stefan