From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Philip Kaludercic Newsgroups: gmane.emacs.devel Subject: Re: fun-names.el --- avoid function duplication Date: Sat, 27 Jul 2024 11:36:42 +0000 Message-ID: <87jzh7cbhx.fsf@posteo.net> References: <8734nvgv5o.fsf@dataswamp.org> Mime-Version: 1.0 Content-Type: text/plain Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="10886"; mail-complaints-to="usenet@ciao.gmane.io" Cc: emacs-devel@gnu.org To: Emanuel Berg Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Sat Jul 27 13:37:31 2024 Return-path: Envelope-to: ged-emacs-devel@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 1sXfjv-0002fz-2D for ged-emacs-devel@m.gmane-mx.org; Sat, 27 Jul 2024 13:37:31 +0200 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1sXfjI-0007cS-Hg; Sat, 27 Jul 2024 07:36:52 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1sXfjF-0007Xu-Fa for emacs-devel@gnu.org; Sat, 27 Jul 2024 07:36:50 -0400 Original-Received: from mout02.posteo.de ([185.67.36.66]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1sXfjC-00022q-VQ for emacs-devel@gnu.org; Sat, 27 Jul 2024 07:36:49 -0400 Original-Received: from submission (posteo.de [185.67.36.169]) by mout02.posteo.de (Postfix) with ESMTPS id 80039240106 for ; Sat, 27 Jul 2024 13:36:43 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=posteo.net; s=2017; t=1722080203; bh=jMwjDhjeo1ulFcyzyfP6Ki/EZbuDvQVzEvC+C3q0RQE=; h=From:To:Cc:Subject:Autocrypt:OpenPGP:Date:Message-ID:MIME-Version: Content-Type:From; b=Ogv3wUgQeKsw/mIf8NoT1LMDrl/x+tsQwavNK/WWAejjguZK2TfXxZLfz6SfOwsjg w3Y9L2Wbxl3o3coD04rKJ7Fcgl6XCPOSrC33R4+wPR7SYSUKqQuL8WVVbwXeV/JVtT SfunD1YBnWeA5bYXwC3SmJXEWw7rCQ3glSQGN28AQn9EHFYFrNGM/B/GvhswKpikNx P33+Lf0529KhvcSDDI4qI5Ipmav2ePIy/4pzB91r8YjY+TK3bPMzwAlebv6IztcBA+ 3kzkMTDgF7meyul6c/KZc79ophVpovtbyTljiPy0jd19MwP+F8aBqrZitmnzDRcjlO DZxFfB/jB/0Zg== Original-Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 4WWMyy5N9Hz6txY; Sat, 27 Jul 2024 13:36:42 +0200 (CEST) In-Reply-To: <8734nvgv5o.fsf@dataswamp.org> (Emanuel Berg's message of "Sat, 27 Jul 2024 09:18:27 +0200") Autocrypt: addr=philipk@posteo.net; keydata= mDMEZBBQQhYJKwYBBAHaRw8BAQdAHJuofBrfqFh12uQu0Yi7mrl525F28eTmwUDflFNmdui0QlBo aWxpcCBLYWx1ZGVyY2ljIChnZW5lcmF0ZWQgYnkgYXV0b2NyeXB0LmVsKSA8cGhpbGlwa0Bwb3N0 ZW8ubmV0PoiWBBMWCAA+FiEEDg7HY17ghYlni8XN8xYDWXahwukFAmQQUEICGwMFCQHhM4AFCwkI BwIGFQoJCAsCBBYCAwECHgECF4AACgkQ8xYDWXahwulikAEA77hloUiSrXgFkUVJhlKBpLCHUjA0 mWZ9j9w5d08+jVwBAK6c4iGP7j+/PhbkxaEKa4V3MzIl7zJkcNNjHCXmvFcEuDgEZBBQQhIKKwYB BAGXVQEFAQEHQI5NLiLRjZy3OfSt1dhCmFyn+fN/QKELUYQetiaoe+MMAwEIB4h+BBgWCAAmFiEE Dg7HY17ghYlni8XN8xYDWXahwukFAmQQUEICGwwFCQHhM4AACgkQ8xYDWXahwukm+wEA8cml4JpK NeAu65rg+auKrPOP6TP/4YWRCTIvuYDm0joBALw98AMz7/qMHvSCeU/hw9PL6u6R2EScxtpKnWof z4oM OpenPGP: id=philipk@posteo.net; url="https://keys.openpgp.org/vks/v1/by-email/philipk@posteo.net"; preference=signencrypt Received-SPF: pass client-ip=185.67.36.66; envelope-from=philipk@posteo.net; helo=mout02.posteo.de X-Spam_score_int: -43 X-Spam_score: -4.4 X-Spam_bar: ---- X-Spam_report: (-4.4 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_MED=-2.3, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.devel:322120 Archived-At: Emanuel Berg writes: > The following message is a courtesy copy of an article > that has been posted to gmane.emacs.devel as well. > > Another idea I just wrote - see the examples what it does. > > I wrote it in the style Mr. Kaludercic prefers, let's see if > he can still find things to improve :) I assume you mean the file structure? That's just (elisp) Library Headers, or what M-x auto-insert generates for you. > ;;; fun-names.el --- avoid function duplication -*- lexical-binding: t -*- > ;; > ;; Author: Emanuel Berg > ;; Created: 2024-07-27 > ;; Keywords: matching > ;; License: GPL3+ > ;; URL: https://dataswamp.org/~incal/emacs-init/fun-names.el > ;; Version: 1.0.0 > ;; > ;;; Commentary: > ;; > ;; Avoid function duplication based on function names. > ;; > ;; Use the function `fun-names' like below to find out what > ;; other functions already use the same words in their names, > ;; and to what degree. > ;; > ;; (fun-names #'fn--string-words) > ;; -> nil > ;; > ;; (fun-names #'gnus-group-mark-buffer) > ;; -> ((gnus-group-mark-group 0.875) > ;; (gnus-group-mark-regexp 0.75 ) > ;; (gnus-group-mark-region 0.75 ) > ;; ... ) > ;; > ;;; Code: > > (require 'cl-lib) > > (defun fun-names (fun &optional limit) > (unless (stringp fun) > (setq fun (symbol-name fun))) > (unless limit > (setq limit 0.70)) > (let ((similar) > (ratio)) > (obarray-map Why not use `mapatoms'? Doesn't make much of a difference in the end. > (lambda (e) > (when (functionp e) > (setq ratio (fn--same-words fun (symbol-name e))) > (when (< limit ratio) > (push (list e ratio) similar)))) > obarray) > (cdr (cl-sort similar #'> :key #'cadr)))) Sort has recently acquired a :key keyword that you can use, depending on what the oldest version of Emacs is that you want to support. > > (defun fn--string-words (str &optional no-sort keep-case) > (unless keep-case > (setq str (downcase str))) > (let ((words (split-string str "[-[:space:]()]+" t "[[:punct:]]+"))) ^ why not use [^[:alnum:]] here? > (if no-sort > words > (sort words)))) > > (defun fn--same-words (s1 s2) > (let* ((w1 (fn--string-words s1)) > (w2 (fn--string-words s2)) Why sort the words, if you are doing a set operation afterwards? > (num (+ (length w1) (length w2))) > (com (- num (length (cl-set-exclusive-or w1 w2 :test #'string=))))) > (/ com num 1.0))) > > (provide 'fun-names) > ;;; fun-names.el ends here -- Philip Kaludercic on peregrine