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: fun-names.el --- avoid function duplication Date: Sat, 27 Jul 2024 09:18:27 +0200 Message-ID: <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="36552"; 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:2WvJn05EMsIPWaAz/BS/lQhiujY= Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Sat Jul 27 10:36:47 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 1sXcv1-0009N2-Od for ged-emacs-devel@m.gmane-mx.org; Sat, 27 Jul 2024 10:36:47 +0200 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1sXcuA-00069q-FS; Sat, 27 Jul 2024 04:35:54 -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 1sXbhO-0002vG-3W for emacs-devel@gnu.org; Sat, 27 Jul 2024 03:18:38 -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 1sXbhM-0001cQ-6D for emacs-devel@gnu.org; Sat, 27 Jul 2024 03:18:37 -0400 Original-Received: from list by ciao.gmane.io with local (Exim 4.92) (envelope-from ) id 1sXbhK-000AR3-AS for emacs-devel@gnu.org; Sat, 27 Jul 2024 09:18:34 +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 04:35:52 -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:322119 Archived-At: 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 :) ;;; 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 (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)))) (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:]]+"))) (if no-sort words (sort 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