Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Он не такой уже непонятный. Чтобы понимать язык, нужно знать его слова. Джей по словам-примитивам намного богаче, чем привычные языки программирования. Например, никого не убивает в С++, операция >>, или ++, или просто скобки {}, служебное слово class и тому подобное.
Также и здесь.
isVar =: [:(91&>*.64&<)[:a.&i.[:{.>
replace =: ((]i.~[:{.[){([:{:[),]`([:<[$:[:>])@.([:32&=[:3!:0[:>]))«2 0
gp =: [:>[:{.>
gv =: [:(#~[:+./»1 isVar«0),.
suit =: ([(0:`(([:(#=[:#[:~.[:{.|:)[:~.[:(#~[:-.[:isVar»0[:{:|:)gv)*.([:*./[:+./[:(isVar«0,=/),:))@.(([:#[)=[:#]))[:gp])»1 0#]
sr =: [(](replace~[:|:])«2[:(([:-.[:isVar{:)»1#])[gv~[:gp])«1 0 suit
groupVars =: [:([:<]$~2:,~[:-:#)»1[:>[:([:<[:;(>@[)([:<,«1 1)»1 2(>@]))/]</.~[:{.|:
isRuleTrue =: ([:+./([:*./](isTrue~[:>])«1 0[:>[)»0 1)`(0:<[:#getVarsFromRule)@.(0:<#@gv@;@;@[)
isTrue =: ]((a:&e.@])+.[:+./[(isRuleTrue~[:>])«1 0[:-.&a:])[:{:[:|:[:-.&(a:,a:)[:(0 2$a:)&,[:>sr
getVars =: ;(([:<[:~.(>@{.@[)gv[:gp])`((>@{.@[)$:(<@<@gp@])([replace~[:|:[:>])»0 0(}.@[)getVarsFromRule~[:>[:{:[:>])@.([:<:[:#[:>]))«1 0 sr
getVarsFromRule =: ](([:{.])#~[(isRuleTrue~[:>])»1 0[:{:])[:|:[(],[:<[replace~[:|:[:>])«1 0[:]`groupVars@.(0:<#)[:~.[:;[:;]([:<[getVars~[:>])»1 0[:;[
Есть особенности работы человеческого мозга, которые не позволяют эффективно парсить подобные структуры.
max(a) + sum(a)/len(a)d =: >./++/%#
d a
[ days[i:i+7] for i in range(0, len(days), 7) ]Если выражения усложняются, то вам как математику и программисту на каком-то уровне придется пойти покурить и передохнуть, чтобы понять длинное выражение со скобочками.
s =: ({. , }. /: 12"_ o. }. - {.) @: /:~g =: _2: }. 0: > (-~1&|.) 11&0.@:* +@:(-~ 2&|.)r =: (1"_ , g , 1"_) # ]hull2 =: [: r^:_ sВ современных языках как раз избегают писать длинные выражения в одну строку. Гораздо понятнее и удобнее разбивать сложный алгоритм на несколько более простых, которые затем комбинируются понятными операторами.
Как быстро вы сможете найти ошибку в следующем алгоритме?
def order(numbers: List[Complex]): List[Complex] = {
val minimal = numbers.min
numbers.sortBy(number => abs(number.phase - minimal.phase))
}
12 o . — это взятие фазы комплексного числа, а?), но я боюсь, и начинающим изучать J тоже.Далее, вы не сортируете углы относительно минимальной точки. Вы сортируете углы относительно 0+j0, просто отняв угол минимальной точки и взяв абсолютное значение.
Но он понятен, но не использует по всей видимости только изначальные языковые вещи. (Я не знаю Питон).
sortBy — это скорее уже библиотечная функция, как и тип List, даже если они из коробки.
Почему это важно? Потому что я показал разбор только одной строки, которая удачно, только с сортировкой связана. На джее таким же образом можно сделать всё.
List и sortBy являются частью стандартной библиотеки? А какая разница? Из Scala стандартную библиотеку убрать нельзя в принципе, поэтому классы коллекций вполне можно считать частью языка как платформы. Я не вижу существенной разницы этого с наличием встроенного в язык функционала, разве что последнее менее гибко.o. применяется для разных случаев. sortBy, я могу с достаточной долей уверенности предполагать, что это какой-то вариант сортировки. Приставка By также намекает, что мы будем указывать то, с помощью чего нужно сортировать. То же самое с фазой комплексного числа: minimal.phase, особенно в контексте того, что minimal имеет тип Complex, однозначно говорит, что мы хотим взять значение фазы. 12 o., к сожалению, об этом говорит чуть менее, чем никак. Особенно если учесть, что, судя по всему, 13 o. и 11 o. будут делать что-то совершенно другое, если это вообще будут корректные выражения.Я опять не понял, что вы хотели сказать. Вы имеете в виду, что те глаголы, которые использу.ются в примере, встроены в язык, а типы и методы вроде List и sortBy являются частью стандартной библиотеки? А какая разница?
В этом то и плюс джея — вилки и крючки. И отсутствие приоритета операций.
делайте очень маленькие простые глаголы и каждому давайте имяИзрядная морока — 60% рабочего времени придумывать имена, причём уникальные, причем непонятно в каком scope-е уникальные…
regexpАга, без переменных и констант любой язык стал бы «Write-only»…
ABC задумывался для использования в целях, аналогичных применению Бейсик, Паскаля и AWK
Оператор PRINT, например, есть в Фортране
Какие идеи Пайтон взял из Бейсика?
ABC — не потомок Бейсика, откуда вы это взяли.
Какие идеи Пайтон взял из БейсикаВ частности, не заключать условия в if и циклах в скобки, в отличие от С. И более, по сравнению с С, «вербозный» синтаксис…
Испытал влияние:Сетл, Алгол 68[1]
Повлиял на:Python, Agena
у J есть ниша – обработка данных, особенно в финансовой сфере
Цель примеров – показать код в таситной форме.
или Abs(Sin(Sqrt(10.5*X)))/(Exp(3*Ln(X*X))-0.143)+2*Pi*X?
NB. Verb to convert TAB-delimited file into numeric array
rdtabfile =: (0&".;.2@:(TAB&,)@:}:);._2) @ ReadFile @<
NB. Verb to process journal and account files
NB. y is (# days in current month);(Account filename);
NB. (Journal filename)
acctprocess =: monad define
'ndays acctfn jourfn' =: y
NB. Read files
'acctano openbal' =. |: rdtabfile acctfn
'jourano jourday jouramt' =. |: rdtabfile jourfn
NB. Verb: given list of days y, return # days that
NB. each balance is a day's closing balance
wt =. monad : '(-~ 1&(|.!.(>:ndays))) 0{"1 y'
NB. Verb: given an Account entry followed by the Journal
NB. entries for the account, produce (closing balance),
NB. (average daily balance)
ab =. monad : '(wt y)({:@] , (%&ndays)@(+/)@:*)+/\1{"1 y'
NB. Create (closing balance),(average daily balance) for
NB. each account. Assign the start-of-month day (1) to the
NB. opening balance
cavg =. (acctano,jourano) ab/.(1,.openbal),jourday,.jouramt
NB. Format and print all results
s =. 'Account %d: Opening %d, closing %d, avg %d\n'
s&printf"1 acctano ,. openbal ,. cavg
''
)
Читал об APL.
<joke>Этим студентом был Урбан Мюллер</joke>
Рассмотрим такой пример на SQL. У нас есть две таблицы:
CREATE TABLE Customers (ID INT, Name TEXT, Age INT, Salary INT) CREATE TABLE Orders (OID INT, Date DATETIME, CustomerID INT, Amount INT)
createTable =: [:|:,.&a:
union =: ([:{.[),:[:([:<[:;]#~~:&a:)"1([:{:[),.([:{:]){~([:{.])i.[:{.[
insert =: [union[:({.,:([:([:<[:(]$~[:1&,#)>)"0{:))[:|:[:>]
rows =: {.([:<,:)"1 1[:|:[:([:<"1[:,.>)"0{:
value =: [:(]`{.@.([:1&=#))[:,[:>[((([:<[)=[:{.])#[:{:])[:>]
pr =: [:,[:(([:>[)(([:<([:>[),.[:>])"0 0)"0 1[:>])/[:([:<[:rows>)"0]
join =: 1 : '((([:{.[:>{.),:[:([:<(>"0))"1[:{:[:1 2 0&|:[:>([:,u"0)#]) (pr y))' Математику придумывали не одно тысячелетииЕсли говорить о современной математической нотации, то, судя по Википедии, все знаки кроме "+" и "-" придумали в 17 веке и позже, "+" и "-" — в конце 15 века.
Правда, мне тоже кажется, что в продакшне такому коду не место.
CREATE TABLE Customers (ID INT, Name TEXT, Age INT, Salary INT) CREATE TABLE Orders (OID INT, Date DATETIME, CustomerID INT, Amount INT)
Customers =: createTable 'ID';'Name';'Age';'Salary' Orders =: createTable 'OID';'Date';'CustomerID';'Amount'
полноценная знаковая система, эффективно распознаваемая мозгом. Синтаксис же J к такой, увы, не относится
Пусти код на J в продакшн и тебя никогда не уволят
|value error: goal
| prolog_code goal'sister_of(mary, X)'
|value error: parse
| prolog_code goal'sister_of(mary, fred)'
|spelling error
| sister_of(X,Y) :- female(X), parents(X, F, M), parents(Y, F, M).
| ^
Язык программирования J. За что любить?