From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: phillip.lord@newcastle.ac.uk (Phillip Lord) Newsgroups: gmane.emacs.devel Subject: Re: Use of `dash` and `s` functions by MELPA packages Date: Tue, 27 Jan 2015 23:39:57 +0000 Message-ID: <87d25zx06q.fsf@newcastle.ac.uk> References: <87r3uga8nw.fsf@gmail.com> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain X-Trace: ger.gmane.org 1422402031 11094 80.91.229.3 (27 Jan 2015 23:40:31 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Tue, 27 Jan 2015 23:40:31 +0000 (UTC) Cc: emacs-devel To: Alexis Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Wed Jan 28 00:40:29 2015 Return-path: Envelope-to: ged-emacs-devel@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 1YGFkC-0003EP-9e for ged-emacs-devel@m.gmane.org; Wed, 28 Jan 2015 00:40:28 +0100 Original-Received: from localhost ([::1]:50527 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YGFkB-00014I-SM for ged-emacs-devel@m.gmane.org; Tue, 27 Jan 2015 18:40:27 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:58450) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YGFjr-00013X-Mr for emacs-devel@gnu.org; Tue, 27 Jan 2015 18:40:11 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YGFjn-0007US-J3 for emacs-devel@gnu.org; Tue, 27 Jan 2015 18:40:07 -0500 Original-Received: from cheviot22.ncl.ac.uk ([128.240.234.22]:48194) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YGFjn-0007TZ-0V for emacs-devel@gnu.org; Tue, 27 Jan 2015 18:40:03 -0500 Original-Received: from smtpauth-vm.ncl.ac.uk ([10.8.233.129] helo=smtpauth.ncl.ac.uk) by cheviot22.ncl.ac.uk with esmtp (Exim 4.63) (envelope-from ) id 1YGFjm-0008Bw-D7; Tue, 27 Jan 2015 23:40:02 +0000 Original-Received: from cpc7-benw10-2-0-cust228.16-2.cable.virginm.net ([77.98.254.229] helo=localhost) by smtpauth.ncl.ac.uk with esmtpsa (TLSv1:AES128-SHA:128) (Exim 4.63) (envelope-from ) id 1YGFjj-0000rk-Fr; Tue, 27 Jan 2015 23:40:01 +0000 In-Reply-To: <87r3uga8nw.fsf@gmail.com> (Alexis's message of "Tue, 27 Jan 2015 20:13:07 +1100") User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-Received-From: 128.240.234.22 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.14 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.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:181863 Archived-At: Fairly interesting. Suggests that the lambda forms are more used, although the anaphoric forms are close behind. I would imagine different people are using the two forms -- although the anaphoric forms are naturally limited, so there is a reason why someone might use both. 5% using dash is pretty amasing, and 4% with s. My own interpretation is that Emacs could do with more of these kind of libraries -- richer APIs for interacting with a few datatypes. I've had a fairly nice experience with f.el as well. Alexis writes: > Hi all, > > Out of interest, i've written a simple Perl5 script to analyse the > extent to which the various functions in the `dash` and `s` packages are > used by packages on MELPA. i've included the script within the org-babel > block at the end of this message; i imagine there are various issues > with its methodology and/or implementation, but feel it's at least a > starting point. Variables at the top of the script allow it to be > modified to analyse the use of libraries other than `dash` and `s`. > > Comments in the script describe how i built all packages locally for the > script to work on. The download and build process took around 4 hours, > via a cable 'net connection and a Core i5 with 4G of RAM. Running the > script takes less than 10 minutes to complete on my system. > > > --- Results --- > > ### > ### Usage of 'dash' by MELPA packages > ### > > 'dash' is used by 259/4506 files (5.75%). > > > # Function usage counts, sorted by decreasing frequency > > Count % Function > ----------------------------------------- > 311 14.55 -when > 299 13.99 -map > 159 7.44 --map > 97 4.54 -filter > 91 4.26 --each > 76 3.56 -each > 76 3.56 --filter > 74 3.46 -if > 60 2.81 -contains > 52 2.43 -flatten > 48 2.25 --first > 42 1.97 -first > 36 1.68 -last > 36 1.68 --remove > 35 1.64 -remove > 30 1.40 --when > 29 1.36 -mapcat > 26 1.22 -any > 25 1.17 -difference > 25 1.17 --reduce > 24 1.12 -reduce > 24 1.12 -concat > 24 1.12 --any > 22 1.03 -elem > 22 1.03 -distinct > 21 0.98 -union > 17 0.80 -find > 17 0.80 -all > 16 0.75 -take > 16 0.75 -sort > 16 0.75 --if > 15 0.70 -select > 15 0.70 -drop > 15 0.70 --mapcat > 14 0.66 -partial > 14 0.66 --sort > 12 0.56 -let > 11 0.51 -zip > 11 0.51 -snoc > 11 0.51 -slice > 11 0.51 -partition > 10 0.47 --keep > 8 0.37 -repeat > 8 0.37 -non > 8 0.37 -min > 8 0.37 --all > 7 0.33 -intersection > 7 0.33 -interpose > 6 0.28 -keep > 6 0.28 -insert > 6 0.28 -dotimes > 6 0.28 --group > 6 0.28 --find > 6 0.28 --dotimes > 5 0.23 -tree > 5 0.23 -list > 5 0.23 --separate > 4 0.19 -replace > 4 0.19 -max > 4 0.19 -lambda > 4 0.19 --drop > 3 0.14 -value > 3 0.14 -iterate > 3 0.14 -is > 3 0.14 -group > 3 0.14 --take > 2 0.09 -separate > 2 0.09 -interleave > 2 0.09 -cons > 2 0.09 -clone > 2 0.09 --split > 2 0.09 --last > 1 0.05 -update > 1 0.05 -table > 1 0.05 -sum > 1 0.05 -split > 1 0.05 -only > 1 0.05 -butlast > 1 0.05 -annotate > 1 0.05 --zip > 1 0.05 --tree > 1 0.05 --partition > 1 0.05 --none > 1 0.05 --max > 0 0.00 -unfold > 0 0.00 -splice > 0 0.00 -same > 0 0.00 -rotate > 0 0.00 -product > 0 0.00 -pad > 0 0.00 -none > 0 0.00 -grade > 0 0.00 -fix > 0 0.00 -cycle > 0 0.00 -count > 0 0.00 --update > 0 0.00 --unfold > 0 0.00 --splice > 0 0.00 --only > 0 0.00 --min > 0 0.00 --iterate > 0 0.00 --fix > 0 0.00 --count > 0 0.00 --annotate > > > # Function usage counts, sorted by function name > > Function Count % > --------------------------------------------- > --all 8 0.37 > --annotate 0 0.00 > --any 24 1.12 > --count 0 0.00 > --dotimes 6 0.28 > --drop 4 0.19 > --each 91 4.26 > --filter 76 3.56 > --find 6 0.28 > --first 48 2.25 > --fix 0 0.00 > --group 6 0.28 > --if 16 0.75 > --iterate 0 0.00 > --keep 10 0.47 > --last 2 0.09 > --map 159 7.44 > --mapcat 15 0.70 > --max 1 0.05 > --min 0 0.00 > --none 1 0.05 > --only 0 0.00 > --partition 1 0.05 > --reduce 25 1.17 > --remove 36 1.68 > --separate 5 0.23 > --sort 14 0.66 > --splice 0 0.00 > --split 2 0.09 > --take 3 0.14 > --tree 1 0.05 > --unfold 0 0.00 > --update 0 0.00 > --when 30 1.40 > --zip 1 0.05 > -all 17 0.80 > -annotate 1 0.05 > -any 26 1.22 > -butlast 1 0.05 > -clone 2 0.09 > -concat 24 1.12 > -cons 2 0.09 > -contains 60 2.81 > -count 0 0.00 > -cycle 0 0.00 > -difference 25 1.17 > -distinct 22 1.03 > -dotimes 6 0.28 > -drop 15 0.70 > -each 76 3.56 > -elem 22 1.03 > -filter 97 4.54 > -find 17 0.80 > -first 42 1.97 > -fix 0 0.00 > -flatten 52 2.43 > -grade 0 0.00 > -group 3 0.14 > -if 74 3.46 > -insert 6 0.28 > -interleave 2 0.09 > -interpose 7 0.33 > -intersection 7 0.33 > -is 3 0.14 > -iterate 3 0.14 > -keep 6 0.28 > -lambda 4 0.19 > -last 36 1.68 > -let 12 0.56 > -list 5 0.23 > -map 299 13.99 > -mapcat 29 1.36 > -max 4 0.19 > -min 8 0.37 > -non 8 0.37 > -none 0 0.00 > -only 1 0.05 > -pad 0 0.00 > -partial 14 0.66 > -partition 11 0.51 > -product 0 0.00 > -reduce 24 1.12 > -remove 35 1.64 > -repeat 8 0.37 > -replace 4 0.19 > -rotate 0 0.00 > -same 0 0.00 > -select 15 0.70 > -separate 2 0.09 > -slice 11 0.51 > -snoc 11 0.51 > -sort 16 0.75 > -splice 0 0.00 > -split 1 0.05 > -sum 1 0.05 > -table 1 0.05 > -take 16 0.75 > -tree 5 0.23 > -unfold 0 0.00 > -union 21 0.98 > -update 1 0.05 > -value 3 0.14 > -when 311 14.55 > -zip 11 0.51 > > > # Files using 'dash', sorted by usage count > > Usage(s) File > ----------------------------------------- > 162 smartparens > 108 projectile > 74 prodigy > 74 emr-elisp > 49 origami > 40 skeletor > 38 flycheck > 38 bog > 37 clj-refactor > 36 magnatune > 36 js2r-functions > 34 cask > 33 cake2 > 30 turnip > 29 dired-subtree > 28 dired-filter > 25 m-buffer > 24 f > 24 cider-interaction > 23 workgroups2 > 22 malinka > 22 jumblr > 21 virtualenvwrapper > 21 helm-bibtex > 21 ecukes-run > 20 wacs-interactive > 20 ecukes-reporter > 18 wonderland > 18 sclang-doc-mode > 18 anaconda-mode > 17 ox-pandoc > 17 commander > 15 projectile-rails > 15 elmacro > 15 color-identifiers-mode > 15 bts > 13 wacs-configuration > 13 omnisharp > 13 fsharp-mode-completion > 13 bbdb-csv-import > 12 sclang-ac-mode > 12 rswitcher > 12 org-drill-table > 12 httprepl > 12 dash-functional > 11 sclang-extensions-utils > 11 org-trello-controller > 11 nrepl-client > 11 litable > 11 keyset > 11 ert-modeline > 11 ecukes-parse > 10 undercover > 10 sclang-extensions > 10 packed > 10 org-trello-data > 10 org-trello-buffer > 10 helm-projectile > 10 emr-c > 10 emr > 10 ebib-utils > 10 dired-ranger > 10 cider-spy > 10 cask-cli > 9 org-trello-proxy > 9 org-transform-tree-table > 8 git > 8 flycheck-mercury > 8 edbi-django > 8 company-tern > 8 color-moccur > 8 cider-test > 7 wrap-region > 7 smart-mode-line > 7 req-package > 7 psci > 7 eyebrowse > 7 ecukes-helpers > 7 dired-hacks-utils > 7 creds > 7 cider-stacktrace > 7 ansi > 6 soundklaus > 6 quickref > 6 paradox > 6 nvm > 6 multifiles > 6 markdown-toc > 6 malabar-reflection > 6 malabar-mode > 6 evil-visual-mark-mode > 6 edts-project > 6 ebib > 5 string-edit > 5 smartparens-html > 5 scala-outline-popup > 5 pallet > 5 orgit > 5 org-trello-action > 5 malabar-project > 5 lxc > 5 lentic-asciidoc > 5 jvm-mode > 5 interval-tree > 5 imgix > 5 helm-flycheck > 5 grass-mode > 5 ert-runner > 5 ensime-config > 5 dired-open > 5 decl > 5 cider > 5 ag > 4 with-editor > 4 web > 4 wacs-util > 4 relative-buffers > 4 org-trello-backend > 4 op-export > 4 navorski > 4 minitest > 4 malabar-import > 4 js2r-helpers > 4 espuds > 4 esh-help > 4 elwm > 4 edts-xref > 4 ecukes-load > 4 ecukes-cli > 4 ecukes > 4 clocker > 3 wand > 3 thumb-frm > 3 tco > 3 simplezen > 3 shadchen > 3 servant > 3 rake > 3 org-trello-cbx > 3 omnisharp-utils > 3 omnisharp-server-actions > 3 omnisharp-auto-complete-actions > 3 noflet > 3 mustache-render > 3 magma-scan > 3 lentic-block > 3 flycheck-haskell > 3 flycheck-ert > 3 emamux-ruby-test > 3 cdnjs > 3 camcorder > 3 bibslurp > 3 auto-compile > 3 ace-jump-buffer > 2 ycmd > 2 tree-buffer > 2 travis-version > 2 solarized > 2 rubocop > 2 recompile-on-save > 2 py-test > 2 prosjekt > 2 pip-requirements > 2 outshine > 2 outline-magic > 2 org-trello-hash > 2 misc-cmds > 2 marmalade-client > 2 malabar-util > 2 malabar-service > 2 magma-smie > 2 magit-find-file > 2 js2r-vars > 2 js2-refactor > 2 ivs-edit > 2 inf-fsharp-mode > 2 helm-projectile-all > 2 hamlet-mode > 2 grunt > 2 go-projectile > 2 gnomenm > 2 gitlab-version > 2 gitlab-ui > 2 flycheck-pos-tip > 2 flycheck-d-unittest > 2 ensime-company > 2 ensime-client > 2 enh-ruby-mode > 2 edts-navigate > 2 ecukes-steps > 2 ecukes-core > 2 doremi-frm > 2 date-field > 2 company-anaconda > 2 cider-util > 2 cider-grimoire > 2 cider-eldoc > 1 with-namespace > 1 wacs-init > 1 trident-mode > 1 travis-utils > 1 tern-django > 1 tbx2org > 1 tagedit > 1 sonic-pi-console > 1 smartparens-config > 1 serverspec > 1 sclang-post-mode > 1 replace-from-region > 1 projmake-elmm > 1 overseer > 1 orglink > 1 org-trello-utils > 1 org-trello-setup > 1 org-trello-entity > 1 org-trello-api > 1 org-trello > 1 org-projectile > 1 marcopolo-version > 1 malabar-semanticdb > 1 malabar-ede-maven > 1 maker-mode > 1 lib-requires > 1 lentic-org > 1 lentic > 1 highlight > 1 helm-gitlab > 1 helm-dirset > 1 helm-aws > 1 helm-ad > 1 flycheck-tip > 1 flycheck-rust > 1 flycheck-ghcmod > 1 flycheck-color-mode-line > 1 flycheck-cask > 1 fakir > 1 evm > 1 eval-in-repl > 1 elnode-proxy > 1 edts-debug > 1 edts-code > 1 ecukes-template > 1 ecukes-reporter-magnars > 1 ecukes-hooks > 1 ecukes-byte-compile > 1 ebib-keywords > 1 dispass > 1 dired-narrow > 1 datomic-snippets > 1 codesearch > 1 clojure-quick-repls > 1 cider-client > 1 cider-classpath > 1 cider-apropos > 1 auto-package-update > 1 angular-snippets > 1 amd-mode > 1 aggressive-fill-paragraph > 1 ac-anaconda > > > # Files using 'dash', sorted alphabetically > > File Usage(s) > ----------------------------------------- > ac-anaconda 1 > ace-jump-buffer 3 > ag 5 > aggressive-fill-paragraph 1 > amd-mode 1 > anaconda-mode 18 > angular-snippets 1 > ansi 7 > auto-compile 3 > auto-package-update 1 > bbdb-csv-import 13 > bibslurp 3 > bog 38 > bts 15 > cake2 33 > camcorder 3 > cask 34 > cask-cli 10 > cdnjs 3 > cider 5 > cider-apropos 1 > cider-classpath 1 > cider-client 1 > cider-eldoc 2 > cider-grimoire 2 > cider-interaction 24 > cider-spy 10 > cider-stacktrace 7 > cider-test 8 > cider-util 2 > clj-refactor 37 > clocker 4 > clojure-quick-repls 1 > codesearch 1 > color-identifiers-mode 15 > color-moccur 8 > commander 17 > company-anaconda 2 > company-tern 8 > creds 7 > dash-functional 12 > date-field 2 > datomic-snippets 1 > decl 5 > dired-filter 28 > dired-hacks-utils 7 > dired-narrow 1 > dired-open 5 > dired-ranger 10 > dired-subtree 29 > dispass 1 > doremi-frm 2 > ebib 6 > ebib-keywords 1 > ebib-utils 10 > ecukes 4 > ecukes-byte-compile 1 > ecukes-cli 4 > ecukes-core 2 > ecukes-helpers 7 > ecukes-hooks 1 > ecukes-load 4 > ecukes-parse 11 > ecukes-reporter 20 > ecukes-reporter-magnars 1 > ecukes-run 21 > ecukes-steps 2 > ecukes-template 1 > edbi-django 8 > edts-code 1 > edts-debug 1 > edts-navigate 2 > edts-project 6 > edts-xref 4 > elmacro 15 > elnode-proxy 1 > elwm 4 > emamux-ruby-test 3 > emr 10 > emr-c 10 > emr-elisp 74 > enh-ruby-mode 2 > ensime-client 2 > ensime-company 2 > ensime-config 5 > ert-modeline 11 > ert-runner 5 > esh-help 4 > espuds 4 > eval-in-repl 1 > evil-visual-mark-mode 6 > evm 1 > eyebrowse 7 > f 24 > fakir 1 > flycheck 38 > flycheck-cask 1 > flycheck-color-mode-line 1 > flycheck-d-unittest 2 > flycheck-ert 3 > flycheck-ghcmod 1 > flycheck-haskell 3 > flycheck-mercury 8 > flycheck-pos-tip 2 > flycheck-rust 1 > flycheck-tip 1 > fsharp-mode-completion 13 > git 8 > gitlab-ui 2 > gitlab-version 2 > gnomenm 2 > go-projectile 2 > grass-mode 5 > grunt 2 > hamlet-mode 2 > helm-ad 1 > helm-aws 1 > helm-bibtex 21 > helm-dirset 1 > helm-flycheck 5 > helm-gitlab 1 > helm-projectile 10 > helm-projectile-all 2 > highlight 1 > httprepl 12 > imgix 5 > inf-fsharp-mode 2 > interval-tree 5 > ivs-edit 2 > js2-refactor 2 > js2r-functions 36 > js2r-helpers 4 > js2r-vars 2 > jumblr 22 > jvm-mode 5 > keyset 11 > lentic 1 > lentic-asciidoc 5 > lentic-block 3 > lentic-org 1 > lib-requires 1 > litable 11 > lxc 5 > m-buffer 25 > magit-find-file 2 > magma-scan 3 > magma-smie 2 > magnatune 36 > maker-mode 1 > malabar-ede-maven 1 > malabar-import 4 > malabar-mode 6 > malabar-project 5 > malabar-reflection 6 > malabar-semanticdb 1 > malabar-service 2 > malabar-util 2 > malinka 22 > marcopolo-version 1 > markdown-toc 6 > marmalade-client 2 > minitest 4 > misc-cmds 2 > multifiles 6 > mustache-render 3 > navorski 4 > noflet 3 > nrepl-client 11 > nvm 6 > omnisharp 13 > omnisharp-auto-complete-actions 3 > omnisharp-server-actions 3 > omnisharp-utils 3 > op-export 4 > org-drill-table 12 > org-projectile 1 > org-transform-tree-table 9 > org-trello 1 > org-trello-action 5 > org-trello-api 1 > org-trello-backend 4 > org-trello-buffer 10 > org-trello-cbx 3 > org-trello-controller 11 > org-trello-data 10 > org-trello-entity 1 > org-trello-hash 2 > org-trello-proxy 9 > org-trello-setup 1 > org-trello-utils 1 > orgit 5 > orglink 1 > origami 49 > outline-magic 2 > outshine 2 > overseer 1 > ox-pandoc 17 > packed 10 > pallet 5 > paradox 6 > pip-requirements 2 > prodigy 74 > projectile 108 > projectile-rails 15 > projmake-elmm 1 > prosjekt 2 > psci 7 > py-test 2 > quickref 6 > rake 3 > recompile-on-save 2 > relative-buffers 4 > replace-from-region 1 > req-package 7 > rswitcher 12 > rubocop 2 > scala-outline-popup 5 > sclang-ac-mode 12 > sclang-doc-mode 18 > sclang-extensions 10 > sclang-extensions-utils 11 > sclang-post-mode 1 > servant 3 > serverspec 1 > shadchen 3 > simplezen 3 > skeletor 40 > smart-mode-line 7 > smartparens 162 > smartparens-config 1 > smartparens-html 5 > solarized 2 > sonic-pi-console 1 > soundklaus 6 > string-edit 5 > tagedit 1 > tbx2org 1 > tco 3 > tern-django 1 > thumb-frm 3 > travis-utils 1 > travis-version 2 > tree-buffer 2 > trident-mode 1 > turnip 30 > undercover 10 > virtualenvwrapper 21 > wacs-configuration 13 > wacs-init 1 > wacs-interactive 20 > wacs-util 4 > wand 3 > web 4 > with-editor 4 > with-namespace 1 > wonderland 18 > workgroups2 23 > wrap-region 7 > ycmd 2 > > > ### End > > > ### > ### Usage of 's' by MELPA packages > ### > > 's' is used by 161/4506 files (3.57%). > > > # Function usage counts, sorted by decreasing frequency > > Count % Function > ----------------------------------------- > 134 12.97 s-match > 130 12.58 s-join > 100 9.68 s-concat > 84 8.13 s-split > 77 7.45 s-matches > 70 6.78 s-trim > 67 6.49 s-starts > 58 5.61 s-blank > 55 5.32 s-chop > 43 4.16 s-equals > 36 3.48 s-replace > 33 3.19 s-ends > 23 2.23 s-contains > 15 1.45 s-lines > 13 1.26 s-format > 11 1.06 s-prepend > 11 1.06 s-append > 9 0.87 s-repeat > 9 0.87 s-lex > 6 0.58 s-chomp > 5 0.48 s-index > 5 0.48 s-downcase > 4 0.39 s-truncate > 4 0.39 s-present > 4 0.39 s-numeric > 3 0.29 s-word > 3 0.29 s-slice > 3 0.29 s-shared > 2 0.19 s-with > 2 0.19 s-upcase > 2 0.19 s-right > 2 0.19 s-pad > 2 0.19 s-lower > 2 0.19 s-left > 2 0.19 s-dashed > 1 0.10 s-upper > 1 0.10 s-snake > 1 0.10 s-presence > 1 0.10 s-capitalize > 0 0.00 s-wrap > 0 0.00 s-uppercase > 0 0.00 s-titleized > 0 0.00 s-titleize > 0 0.00 s-reverse > 0 0.00 s-mixedcase > 0 0.00 s-lowercase > 0 0.00 s-less > 0 0.00 s-count > 0 0.00 s-collapse > 0 0.00 s-center > 0 0.00 s-capitalized > 0 0.00 s--truthy > 0 0.00 s--mapcar > 0 0.00 s--aget > > > # Function usage counts, sorted by function name > > Function Count % > --------------------------------------------- > s--aget 0 0.00 > s--mapcar 0 0.00 > s--truthy 0 0.00 > s-append 11 1.06 > s-blank 58 5.61 > s-capitalize 1 0.10 > s-capitalized 0 0.00 > s-center 0 0.00 > s-chomp 6 0.58 > s-chop 55 5.32 > s-collapse 0 0.00 > s-concat 100 9.68 > s-contains 23 2.23 > s-count 0 0.00 > s-dashed 2 0.19 > s-downcase 5 0.48 > s-ends 33 3.19 > s-equals 43 4.16 > s-format 13 1.26 > s-index 5 0.48 > s-join 130 12.58 > s-left 2 0.19 > s-less 0 0.00 > s-lex 9 0.87 > s-lines 15 1.45 > s-lower 2 0.19 > s-lowercase 0 0.00 > s-match 134 12.97 > s-matches 77 7.45 > s-mixedcase 0 0.00 > s-numeric 4 0.39 > s-pad 2 0.19 > s-prepend 11 1.06 > s-presence 1 0.10 > s-present 4 0.39 > s-repeat 9 0.87 > s-replace 36 3.48 > s-reverse 0 0.00 > s-right 2 0.19 > s-shared 3 0.29 > s-slice 3 0.29 > s-snake 1 0.10 > s-split 84 8.13 > s-starts 67 6.49 > s-titleize 0 0.00 > s-titleized 0 0.00 > s-trim 70 6.78 > s-truncate 4 0.39 > s-upcase 2 0.19 > s-upper 1 0.10 > s-uppercase 0 0.00 > s-with 2 0.19 > s-word 3 0.29 > s-wrap 0 0.00 > > > # Files using 's', sorted by usage count > > Usage(s) File > ----------------------------------------- > 70 clj-refactor > 35 sclang-extensions-utils > 35 projectile > 32 malinka > 32 ecukes-parse > 31 emr-elisp > 27 projectile-rails > 27 commander > 26 skeletor > 26 list-packages-ext > 24 helm-bibtex > 22 turnip > 20 cake2 > 18 weechat > 18 sclang-ac-mode > 18 melpa-upstream-visit > 17 ecukes-reporter > 16 fsharp-mode-completion > 16 fountain-mode > 15 virtualenvwrapper > 14 prodigy > 14 emr > 13 sphinx-doc > 13 mustache-lex > 12 simplezen > 10 soundklaus > 10 org-trello-data > 10 nvm > 10 gotest > 9 magnatune > 9 magit-gh-pulls > 9 httprepl > 9 flycheck-mercury > 9 espuds > 9 ert-runner > 9 emamux-ruby-test > 8 sclang-post-mode > 8 ecukes-run > 7 weechat-relay > 7 phpunit > 7 org-trello-cbx > 7 mustache-render > 7 git > 7 elmacro > 7 cerbere-phpunit > 6 web > 6 org-drill-table > 6 ecukes-cli > 6 bibslurp > 5 timesheet > 5 marcopolo-utils > 5 maker-mode > 5 jumblr > 5 ecukes > 5 cask-cli > 5 bts > 5 ag > 4 weechat-image > 4 weechat-color > 4 show-css > 4 relative-buffers > 4 mustache-parse > 4 maven-test-mode > 4 marcopolo-registry > 4 imgix > 4 helm-gitlab > 4 helm-dirset > 4 gradle-mode > 4 f > 4 emr-scheme > 4 emr-c > 4 cerbere-gotest > 3 weechat-corrector > 3 weechat-button > 3 travis-utils > 3 tagedit > 3 sclang-doc-mode > 3 psci > 3 password-store > 3 markdown-toc > 3 marcopolo-mode > 3 elmine > 3 ecukes-steps > 3 ecukes-load > 3 crm-custom > 3 company-ycmd > 3 cake-inflector > 3 buffer-combine > 3 angular-snippets > 2 weechat-tracking > 2 weechat-spelling > 2 weechat-cmd > 2 wand > 2 serverspec > 2 s-buffer > 2 org-trello-proxy > 2 org-trello-buffer > 2 navorski > 2 marcopolo-hub > 2 magma-interactive > 2 helm-github-stars > 2 hamlet-mode > 2 goto-gem > 2 gitlab-utils > 2 gitlab-issues > 2 gitlab-groups > 2 fsharp-mode > 2 ert-modeline > 2 ensime-company > 2 elnode-proxy > 2 edbi-django > 2 ecukes-reporter-landing > 2 ecukes-core > 2 company-tern > 2 ansible > 2 amd-mode > 1 weechat-core > 1 travis-repos > 1 travis-mode > 1 travis-builds > 1 tbx2org > 1 stock-ticker > 1 signature-display > 1 signature-backend > 1 shelldoc > 1 quickref > 1 pallet > 1 org-trello-utils > 1 org-trello-setup > 1 org-transform-tree-table > 1 livid-mode > 1 kurecolor > 1 js2r-helpers > 1 js2r-conditionals > 1 http > 1 hookify > 1 helm-project-persist > 1 helm-bm > 1 helm-backup > 1 gnomenm > 1 gitlab-session > 1 gitlab-projects > 1 flycheck-tip > 1 eyuml > 1 evm > 1 ensime-vars > 1 ensime-mode > 1 emr-prog > 1 emr-lisp > 1 elnode > 1 ecukes-template > 1 ecukes-reporter-progress > 1 ecukes-new > 1 ecukes-helpers > 1 ecukes-def > 1 eclim-completion > 1 dollaro > 1 dired-filter > 1 creds > 1 company-edbi > 1 anaconda-mode > > > # Files using 's', sorted alphabetically > > File Usage(s) > ----------------------------------------- > ag 5 > amd-mode 2 > anaconda-mode 1 > angular-snippets 3 > ansible 2 > bibslurp 6 > bts 5 > buffer-combine 3 > cake-inflector 3 > cake2 20 > cask-cli 5 > cerbere-gotest 4 > cerbere-phpunit 7 > clj-refactor 70 > commander 27 > company-edbi 1 > company-tern 2 > company-ycmd 3 > creds 1 > crm-custom 3 > dired-filter 1 > dollaro 1 > eclim-completion 1 > ecukes 5 > ecukes-cli 6 > ecukes-core 2 > ecukes-def 1 > ecukes-helpers 1 > ecukes-load 3 > ecukes-new 1 > ecukes-parse 32 > ecukes-reporter 17 > ecukes-reporter-landing 2 > ecukes-reporter-progress 1 > ecukes-run 8 > ecukes-steps 3 > ecukes-template 1 > edbi-django 2 > elmacro 7 > elmine 3 > elnode 1 > elnode-proxy 2 > emamux-ruby-test 9 > emr 14 > emr-c 4 > emr-elisp 31 > emr-lisp 1 > emr-prog 1 > emr-scheme 4 > ensime-company 2 > ensime-mode 1 > ensime-vars 1 > ert-modeline 2 > ert-runner 9 > espuds 9 > evm 1 > eyuml 1 > f 4 > flycheck-mercury 9 > flycheck-tip 1 > fountain-mode 16 > fsharp-mode 2 > fsharp-mode-completion 16 > git 7 > gitlab-groups 2 > gitlab-issues 2 > gitlab-projects 1 > gitlab-session 1 > gitlab-utils 2 > gnomenm 1 > gotest 10 > goto-gem 2 > gradle-mode 4 > hamlet-mode 2 > helm-backup 1 > helm-bibtex 24 > helm-bm 1 > helm-dirset 4 > helm-github-stars 2 > helm-gitlab 4 > helm-project-persist 1 > hookify 1 > http 1 > httprepl 9 > imgix 4 > js2r-conditionals 1 > js2r-helpers 1 > jumblr 5 > kurecolor 1 > list-packages-ext 26 > livid-mode 1 > magit-gh-pulls 9 > magma-interactive 2 > magnatune 9 > maker-mode 5 > malinka 32 > marcopolo-hub 2 > marcopolo-mode 3 > marcopolo-registry 4 > marcopolo-utils 5 > markdown-toc 3 > maven-test-mode 4 > melpa-upstream-visit 18 > mustache-lex 13 > mustache-parse 4 > mustache-render 7 > navorski 2 > nvm 10 > org-drill-table 6 > org-transform-tree-table 1 > org-trello-buffer 2 > org-trello-cbx 7 > org-trello-data 10 > org-trello-proxy 2 > org-trello-setup 1 > org-trello-utils 1 > pallet 1 > password-store 3 > phpunit 7 > prodigy 14 > projectile 35 > projectile-rails 27 > psci 3 > quickref 1 > relative-buffers 4 > s-buffer 2 > sclang-ac-mode 18 > sclang-doc-mode 3 > sclang-extensions-utils 35 > sclang-post-mode 8 > serverspec 2 > shelldoc 1 > show-css 4 > signature-backend 1 > signature-display 1 > simplezen 12 > skeletor 26 > soundklaus 10 > sphinx-doc 13 > stock-ticker 1 > tagedit 3 > tbx2org 1 > timesheet 5 > travis-builds 1 > travis-mode 1 > travis-repos 1 > travis-utils 3 > turnip 22 > virtualenvwrapper 15 > wand 2 > web 6 > weechat 18 > weechat-button 3 > weechat-cmd 2 > weechat-color 4 > weechat-core 1 > weechat-corrector 3 > weechat-image 4 > weechat-relay 7 > weechat-spelling 2 > weechat-tracking 2 > > > ### End > > > --- End results --- > > > > #+begin_src perl > > #!/usr/bin/perl > > ### > # > # The following script assumes the following commands have been > # run from a shell: > # > # $ git clone https://github.com/milkypostman/melpa > # $ cd melpa > # $ make all > # $ cd packages > # $ for i in *.tar; do tar xf $i; done > # > # The library being analysed is specified via > # the $util_package_name and $util_package_prefix > # variables. > # > # The value of $elpa_dir will probably need to be > # modified to reflect the location of the > # melpa/packages directory on your system. > # > ### > > > use strict; > use warnings; > > use English; > use File::Find; > > > # -- Initialisations -- > > # Variables which can be set by the user. > > my $elpa_dir = $ENV{HOME} . '/src/github/melpa/packages/'; > my $util_package_name = 'dash'; > # We can't simply generate this from $util_package_name > # because it would break on (at least) dash.el. > my $util_package_prefix = '-'; > > # Internal variables. > > my $all_function_occurences = 0; > my $all_usage_occurences = 0; > my $count; > my $dh; > my $fh; > my $func; > my $package_count = 0; > my $package_element; > my $percentage; > my $usage_percentage = 0; > > my @funcs_by_frequency; > my @funcs_by_name; > my @package_elements_by_usage_frequency; > my @package_elements_by_name; > my @packages; > > my %files_using_util_package; > my %usages; > my %util_package_functions; > > > # -- Helper functions. -- > > sub extract_util_package_functions { > > if (/^${util_package_name}(-\d{8}\.\d+)?\.el$/) { > > my $f = $File::Find::name; > open($fh, '<', $f) || die "Couldn't open $f: $!"; > while (<$fh>) { > if (/\(defun (${util_package_prefix}-?[[:alnum:]]+)/ > || /\(defmacro (${util_package_prefix}-?[[:alnum:]]+)/) { > $util_package_functions{$1} = 0; > } > } > > } > } > > sub analyse_functions_usage { > > if (/^([-[:alnum:]]+)(?:-\d{8}\.\d+)?\.el$/) { > > my $package_element = $1; > my $filename = $_; > > if ($package_element =~ /-pkg/) { > return; > } > if ($filename =~ /^${util_package_name}-\d{8}\.\d+\.el$/) { > return; > } > > push @packages, $package_element; > $package_count++; > print "Analysing $package_element ....\n"; > > open($fh, '<', $File::Find::name) || die "Couldn't open $File::Find::name: $!"; > while (<$fh>) { > for my $key (keys %util_package_functions) { > if (/\(${key}/) { > $util_package_functions{$key}++; > $usages{$package_element}++; > } > } > } > close $fh || die "Couldn't close $File::Find::name: $!"; > > } > } > > > # -- Processing -- > > find(\&extract_util_package_functions, ($elpa_dir)); > finddepth(\&analyse_functions_usage, ($elpa_dir)); > > > # -- Calculations -- > > $all_usage_occurences = scalar(keys %usages); > $usage_percentage = $all_usage_occurences / $package_count * 100; > > for my $key (keys %util_package_functions) { > $all_function_occurences += $util_package_functions{$key}; > } > > for $func (sort keys %util_package_functions) { > $count = sprintf("%3u", $util_package_functions{$func}); > $percentage = sprintf('%2.2f', ($util_package_functions{$func} / $all_function_occurences * 100)); > push @funcs_by_frequency, $count . "\t" . $percentage . "\t" . $func; > push @funcs_by_name, $func . "\t" . $count . "\t" . $percentage; > } > > for $package_element (sort keys %usages) { > $count = sprintf("%3u", $usages{$package_element}); > push @package_elements_by_usage_frequency, $count . "\t" . $package_element; > push @package_elements_by_name, $package_element . "\t" . $count; > } > > > # -- Results -- > > $FORMAT_LINES_PER_PAGE = 999; > $OUTPUT_AUTOFLUSH = 1; > > print "\n"; > print "###\n"; > print "### Usage of '$util_package_name' by MELPA packages\n"; > print "###\n\n"; > print "'$util_package_name' is used by ${all_usage_occurences}/${package_count} files (" . sprintf("%2.2f", $usage_percentage) . "%).\n\n\n"; > > print "# Function usage counts, sorted by decreasing frequency\n\n"; > > format Frequency_top = > Count % Function > ----------------------------------------- > . > > format Frequency = > @### @##.## @<<<<<<<<<<<<<<<<<<<< > $count, $percentage, $func > . > > $FORMAT_LINES_LEFT = 0; > $FORMAT_TOP_NAME = 'Frequency_top'; > $FORMAT_NAME = 'Frequency'; > for my $elt (reverse sort @funcs_by_frequency) { > ($count, $percentage, $func) = split('\t', $elt); > write; > } > > print "\n\n"; > print "# Function usage counts, sorted by function name\n\n"; > > format Name_top = > Function Count % > --------------------------------------------- > . > > format Name = > @<<<<<<<<<<<<<<<<<<<<<<<< @### @##.## > $func, $count, $percentage > . > > $FORMAT_LINES_LEFT = 0; > $FORMAT_TOP_NAME = 'Name_top'; > $FORMAT_NAME = 'Name'; > for my $elt (sort @funcs_by_name) { > ($func, $count, $percentage) = split('\t', $elt); > write; > } > > print "\n\n"; > print "# Files using '$util_package_name', sorted by usage count\n\n"; > > format File_usages_count_top = > Usage(s) File > ----------------------------------------- > . > > format File_usages_count = > @### @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< > $count, $package_element > . > > $FORMAT_LINES_LEFT = 0; > $FORMAT_TOP_NAME = 'File_usages_count_top'; > $FORMAT_NAME = 'File_usages_count'; > for my $elt (reverse sort @package_elements_by_usage_frequency) { > ($count, $package_element) = split('\t', $elt); > write; > } > > print "\n\n"; > print "# Files using '$util_package_name', sorted alphabetically\n\n"; > > format File_usages_alphabetically_top = > File Usage(s) > ----------------------------------------- > . > > format File_usages_alphabetically = > @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @## > $package_element, $count > . > > $FORMAT_LINES_LEFT = 0; > $FORMAT_TOP_NAME = 'File_usages_alphabetically_top'; > $FORMAT_NAME = 'File_usages_alphabetically'; > for my $elt (sort @package_elements_by_name) { > ($package_element, $count) = split('\t', $elt); > write; > } > > print "\n\n"; > print "### End\n\n"; > > #+end_src > > > > Alexis.