From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Emanuel Berg Newsgroups: gmane.emacs.devel Subject: Re: fun-names.el --- avoid function duplication Date: Sat, 27 Jul 2024 16:41:48 +0200 Message-ID: <87frrugamr.fsf@dataswamp.org> References: <8734nvgv5o.fsf@dataswamp.org> <87jzh7cbhx.fsf@posteo.net> Mime-Version: 1.0 Content-Type: text/plain Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="11600"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Cc: Philip Kaludercic To: emacs-devel@gnu.org Cancel-Lock: sha1:OfukEYWlEogXMDrxfQpb74mZ5Qo= Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Sat Jul 27 17:38:18 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 1sXjUv-0002pU-US for ged-emacs-devel@m.gmane-mx.org; Sat, 27 Jul 2024 17:38:18 +0200 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1sXjTy-0006vo-VN; Sat, 27 Jul 2024 11:37:19 -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 1sXicS-0006NG-Hh for emacs-devel@gnu.org; Sat, 27 Jul 2024 10:42:00 -0400 Original-Received: from ciao.gmane.io ([116.202.254.214]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1sXicQ-0005dq-LP for emacs-devel@gnu.org; Sat, 27 Jul 2024 10:42:00 -0400 Original-Received: from list by ciao.gmane.io with local (Exim 4.92) (envelope-from ) id 1sXicO-00028E-Di for emacs-devel@gnu.org; Sat, 27 Jul 2024 16:41:56 +0200 X-Injected-Via-Gmane: http://gmane.org/ Mail-Followup-To: emacs-devel@gnu.org Mail-Copies-To: never Received-SPF: pass client-ip=116.202.254.214; envelope-from=ged-emacs-devel@m.gmane-mx.org; helo=ciao.gmane.io 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, HEADER_FROM_DIFFERENT_DOMAINS=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Sat, 27 Jul 2024 11:37:15 -0400 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:322130 Archived-At: Philip Kaludercic wrote: > Why not use `mapatoms'? [...] > why not use [^[:alnum:]] here? [...] > Why sort the words OK! Fixed. But I'm keeping `cl-sort'. ;;; 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.3.5 ;; ;;; Commentary: ;; ;; Avoid function duplication based on function names. ;; ;; Use the function `fun-names' like in the below examples 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 ) ... ) ;; ;; output a report: ;; ;; (fun-names #'gnus-group-mark-buffer 0.65 t) ; all ;; (fun-names #'gnus-group-mark-buffer 0.65 10) ; top 10 ;; ;; 1. gnus-group-mark-group 0.88 ;; 2. gnus-group-mark-regexp 0.75 ;; 3. gnus-group-mark-region 0.75 ;; 4. gnus-group-setup-buffer 0.75 ;; 5. gnus-uu-mark-buffer 0.75 ... ;; ;;; Code: (require 'cl-lib) (require 'subr-x) (defun fun-names (fun &optional limit report) (unless (stringp fun) (setq fun (symbol-name fun))) (unless limit (setq limit 0.7)) (let ((similar) (ratio)) (mapatoms (lambda (e) (when (functionp e) (setq ratio (fn--same-words fun (symbol-name e))) (when (and (<= limit ratio) (< ratio 1)) (push (list e ratio) similar))))) (let ((sorted (cl-sort similar #'> :key #'cadr))) (if report (fn--report sorted report fun) sorted)))) (defun fn--report (data &optional max strs) (when (numberp max) (setq data (take max data))) (let ((buf (get-buffer-create "*fun-names*")) (pad (1+ (apply #'max (mapcar (lambda (e) (length (symbol-name (car e)))) data))))) (with-current-buffer buf (erase-buffer) (insert (format "search: %s\n\n" strs)) (cl-loop for i from 1 for (n r) in data do (insert (format "%2d. %s%.2f\n" i (string-pad (symbol-name n) pad) r))) (goto-char (point-min))) (pop-to-buffer buf))) (defun fn--string-words (str &optional sort keep-case) (unless keep-case (setq str (downcase str))) (let ((words (split-string str "[^[:alnum:]]+" t "[[:punct:]]+"))) (if sort (sort words) words))) (defun fn--same-words (s1 s2) (let* ((w1 (fn--string-words s1)) (w2 (fn--string-words s2)) (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 -- underground experts united https://dataswamp.org/~incal