Rosetta Code/Rank languages by popularity: Difference between revisions

m (Update programming language count)
Line 3,773:
9: 904 - Zkl
10: 901 - J</pre>
 
=={{header|Phix}}==
The distributed version also has an output_html option.
<lang Phix>-- demo\rosetta\Rank_Languages.exw
include builtins\timedate.e
include builtins\libcurl.e
 
constant limit = 20, -- 0 to list all
refresh_cache = timedelta(days:=1), -- 0 for always
languages = "http://rosettacode.org/wiki/Category:Programming_Languages",
categories = "http://www.rosettacode.org/mw/index.php?title=Special:Categories&limit=5000"
 
function open_download(string filename, url)
bool refetch = true
if file_exists(filename) then
-- use existing file if <= refresh_cache (1 day) old
sequence last_mod = get_file_date(filename) -- (0.8.1+)
atom delta = timedate_diff(last_mod,date())
refetch = (delta>refresh_cache)
end if
if refetch then
printf(1,"Downloading %s...\n",{filename})
CURLcode res = curl_easy_get_file(url,"",filename) -- (no proxy)
if res!=CURLE_OK then
string error = sprintf("%d",res)
if res=CURLE_COULDNT_RESOLVE_HOST then
error &= " [CURLE_COULDNT_RESOLVE_HOST]"
end if
printf(1, "Error %s downloading file\n", error)
{} = wait_key()
abort(0)
end if
end if
return get_text(filename)
end function
 
constant cat_title = "title=\"Category:"
 
function extract_names()
sequence results = {} -- {rank,count,name}
 
-- 1) extract languages from eg title="Category:Phix"
sequence language_names = {}
string langs = open_download("languages.htm",languages),
language_name
langs = langs[1..match("<div class=\"printfooter\">",langs)-1]
integer start = match("<h2>Subcategories</h2>",langs), k
while true do
k = match(cat_title,langs,start)
if k=0 then exit end if
k += length(cat_title)
start = find('"',langs,k)
language_name = langs[k..start-1]
language_names = append(language_names,language_name)
end while
 
-- 2) extract results from eg title="Category:Phix">Phix</a>?? (997 members)</li>
-- but obviously only when we have found that language in the phase above.
-- (note there is / ignore some wierd uncode-like stuff after the </a>...)
string cats = open_download("categories.htm",categories)
start = 1
while true do
k = match(cat_title,cats,start)
if k=0 then exit end if
k += length(cat_title)
start = find('"',cats,k)
language_name = cats[k..start-1]
start = match("</a>",cats,start)+4
if find(language_name,language_names) then
while not find(cats[start],"(<") do start += 1 end while -- (ignore)
string members = cats[start..find('<',cats,start+1)]
members = substitute(members,",","")
sequence res = scanf(members,"(%d member%s)<")
results = append(results,{0,res[1][1],language_name})
end if
end while
results = sort_columns(results,{-2,3}) -- (descending 2nd column, then asc 3rd)
 
--3) assign rank
integer count, prev = 0, rank
for i=1 to length(results) do
count = results[i][2]
if count!=prev then rank = i end if
prev = count
results[i][1] = rank
end for
 
return results
end function
 
procedure show(sequence results)
for i=1 to iff(limit?limit:length(results)) do
printf(1,"%3d: %,d - %s\n",results[i])
end for
end procedure
 
show(extract_names())</lang>
{{out}}
As of April 26th, 2019
<pre>
1: 1,137 - Go
2: 1,075 - Perl 6
3: 1,054 - Python
4: 1,042 - Kotlin
5: 1,006 - Perl
6: 998 - Julia
7: 997 - Phix
8: 989 - Racket
9: 949 - C
10: 934 - J
11: 931 - Zkl
12: 930 - Tcl
13: 906 - Java
14: 902 - REXX
15: 875 - D
16: 873 - Ruby
17: 869 - Haskell
18: 804 - Sidef
19: 793 - Scala
20: 775 - PicoLisp
</pre>
 
=={{header|PicoLisp}}==
7,820

edits