thedeemon: (office)
[personal profile] thedeemon
Давно заметил, что если нужно перевести слово, вместо рыскания по словарям, дающим сразу десяток значений, часто самый адекватный перевод получается, если открыть по этому слову страницу в википедии и посмотреть, как называется эта страница на русском.



Сейчас сделал себе из этого консольный переводчик. Теперь могу в консоли так делать:
>ru meerkat
Сурикат

>ru sodium
Натрий

Вот весь исходник с парой занятных моментов:
import std.stdio, std.net.curl, std.json;

auto rus(string s) { 
  version(Windows) { import std.windows.charset, std.conv; return toMBSz(s, 866).text; }
  else return s;
}

void main(string[] argv) {
  scope(failure) return;
  if (argv.length < 2) return writeln("usage: ru word");
  get("https://en.wikipedia.org/w/api.php?action=query&format=json&prop=langlinks&lllang=ru&titles="~argv[1])
    .parseJSON["query"]["pages"].object.values[0]["langlinks"][0]["*"].str.rus.writeln;
}

Старожилы рассказывают, что в древнем наречии Visual Basic было заклинание On Error Resume Next, которое говорило в случае ошибки ее тупо игнорировать и идти дальше. Часто его вспоминаю, когда использую в D другое заклинание - scope(failure) return. Конструкция scope заворачивает код до конца скоупа в try-catch и позволяет указать некоторый код, который будет выполнен если вылетело исключение (scope(failure)), если не вылетело (scope(success)) или в любом случае (scope(exit)). Удобно для всяких RAII-подобных вещей, когда лень писать честный try-catch-finally или создавать обертку с деструктором. Так вот, если в scope(..) засунуть return, это приведет к тихому выходу из функции без дальшейшего пробрасывания исключения. В данном примере это означает, что если не удалось сделать запрос или найти в ответе искомое, программа завершается молча.
Другой забавный момент - как точки помогают писать в бесточечном стиле. :) За счет активного использования UFCS (universal function call syntax), методов и свойств, в теле main вообще ни одной переменной. В Окамле, F# или Elm'e это было бы много слов, разделенных |>, а в хаскеле - точками или $ да еще в обратном порядке. D-ивный вариант бесточечной записи через точки мне сейчас субъективно симпатичней.
Если вдруг кому нужно, виндовый бинарник можно взять тут, а можете и на свой любимый язык переложить, там логики-то на две строчки.

Date: 2016-07-06 08:34 am (UTC)
From: [identity profile] yantayga.livejournal.com
А scope вложенные быть могут?

Date: 2016-07-06 08:50 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Могут и вложенные и просто подряд идущие - выполняются в обратном порядке.

Date: 2016-07-06 11:23 am (UTC)
From: [identity profile] kodt-rsdn.livejournal.com
А если два скопа с разными ретурнами, кто кого переборет?

Date: 2016-07-06 12:00 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
Щас попробовал, компилятор говорит, что return не в любом scope(..) может быть, а только в scope(failure). Соответственно, который первый выстрелит (самый вложенный), тот и переборет.

Date: 2016-07-06 08:35 am (UTC)
From: [identity profile] theiced.livejournal.com
я osxный словарик использую (New Oxford American Dictionary) из емакса (osx-dictionary). вообще офигенно.

Date: 2016-07-06 08:37 am (UTC)
From: [identity profile] theiced.livejournal.com
https://www.dropbox.com/s/qrujh54kwdv4cyn/Screenshot%202016-07-06%2011.37.44.png?dl=0

Date: 2016-07-06 11:06 am (UTC)
From: [identity profile] voidex.livejournal.com
У меня скрипт с мультитрана берет

Date: 2016-07-06 11:22 am (UTC)
From: [identity profile] kodt-rsdn.livejournal.com
Я так однажды написал на баше скрипт для гугловодчика... так после серии отладочных запусков меня в гугле забанили.
Понадеемся, что википедия не настолько бдительная.
Либо надо, хотя бы для приличия, подсовывать курлу реферер и юзерагент от настоящего браузера.
dememax: (коварство)
From: [personal profile] dememax
Круто!
Просто!
Пришлось в документации к Вики покопаться, чтобы такой запросец составить?
From: [identity profile] thedeemon.livejournal.com
Да, у них есть Web API и даже песочница к нему, немножко почитал доки.

Date: 2016-07-06 04:21 pm (UTC)
From: [identity profile] juan-gandhi.livejournal.com
Замечательно. Лучший пост с утреца.

Date: 2016-07-06 06:39 pm (UTC)
From: [identity profile] 109.livejournal.com
> это означает, что если не удалось сделать запрос или найти в ответе искомое, программа завершается молча.

что позволено юпитеру... вот сейчас молодая шпана решит, что это нормально.

Date: 2016-07-06 06:44 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
"Не повторяйте это дома!" :)

Date: 2016-07-07 01:29 pm (UTC)
From: [identity profile] achek.livejournal.com
Мой вариант на Lua (5.3.3):

https  ()
json  ()
 arg    ();  
url    arg[]
 i  , arg  url  url    arg[i] 
body, code  https.request(url)
 code    (, code); () 
 _, v  (json.decode(body).query.pages) 
    (v.title, , v.langlinks  v.langlinks[][]  )

Edited Date: 2016-07-07 01:45 pm (UTC)

Date: 2016-07-08 11:10 am (UTC)
From: [identity profile] Адепт самодиципліни (from livejournal.com)
У Вики есть API! Век живи... :-)

Profile

thedeemon: (Default)
Dmitry Popov

December 2025

S M T W T F S
 12 3456
789101112 13
14151617181920
21222324252627
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 26th, 2026 12:42 am
Powered by Dreamwidth Studios