Nowy numer JVM Bloggers do poczytania :) Tygodniowa prasówka + garść ciekawych artykułów wokół IT. Zapraszam, miłego czytania i smacznej kawusi :)
Wszystkie blogi o Javie, ekosystemie JVM i programowaniu pisane przez polskich programistów i polskie firmy w jednym miejscu, co tydzień nowe wydanie, co tydzień nowa porcja wiedzy
Wracamy do regularnego postowania JVM Bloggers. tygodniowa prasówka + garść ciekawych artykułów wokół IT. Zapraszam, miłego czytania i smacznej kawusi :)
Wszystkie blogi o Javie, ekosystemie JVM i programowaniu pisane przez polskich programistów i polskie firmy w jednym miejscu, co tydzień nowe wydanie, co tydzień nowa porcja wiedzy
@WhiteLightning: Wiem, wiem... życie, bombelki, praca plus zacząłem studia (w piątki mam już zjazdy) i trochę brakuje czasu. Ale mam silne postanowienie poprawy! :)
Zarobki w IT. Oferują im już 34 tys. zł netto, a ssanie na rynku jest tak duże, że Scali uczą za darmo
Jakby ktoś sie pytał od ktorego języka programowania zacząć :p
@Afish: no generalnie gdyby skalowców było dużo, no to ludzi najlepszych bym stawiał gdzieś na pewno w pierwszym percentylu, może nawet wyżej, od 0.5? i to oni mieliby te 34k. Dlatego pytałem wcześniej czy miałeś na myśli o top1000 lub top100, bo nie wiem ile osób w tym programuje. To w takim razie jeszcze gorzej dla scalowców.
no tak, ale to nie mój problem ;)
@1a2b3c4d5e: Okej, to teraz rozumiem. Ten artykuł i tak mówi o ofertach, więc pewnie jest lepiej. Trzeba byłoby przejrzeć jakiegoś glassdoora czy blinda, bo topka specjalistów raczej się nie przejmuje widełkami w ofertach, tylko rzuca swoją cenę i na tej podstawie negocjuje.
Słucham sobie dzisiaj i oglądam warsztad Johna De Goes na temat Scala 3
z https://www.functionalscala.com/ (niestety płatne, raczej drogie i rejestracja zakończona)
Kurteczka, podoba mi się ta Scala 3 - mam przyjemność z patrzenia na język.
Tak jak Scala2 to był jezyk, który od razu kojarzył mi się ze śmietnikiem - jakiś konglomerat składni i ficzerów ze wszystkiego,
Tak teraz to wygląda ... po prostu elegancko.
Główna zmiana to pytonizacja czyli koniec z wąsami - mamy znaczące spacje. Czyściej kod po tym wygląda.
Mimo, że ewidentnie zmiany są inspirowane też haskellem (i wspomnianym pytonem) to dla niektórych teraz Scala może teraz przypominac pascala :-).
def tooBigMethod() =
println(".")
println("..")
println("...")
println("....")
println(".....")
println("......")
println(".......")
println("........")
end tooBigMethod
def conditional3(answer: Int) =
if (answer == 42)
println("The answer to the meaning of life, the universe, and everything.")
end if
def conditional(x: Int) =
if x > 0 then println("Positive")
else println("Non-positive")
Btw. Pascal to język, który nietypowo jak na boomera prawie całkiem mnie ominął... ale już od dawna widziałem, że miał dużo elegancji, której brakowało wszystkiemu co było inspirowane składnią C (włączając javę).
Niestety ( jak widać w kodzie ) scala3 nie rozwiązuje największego problemu scali - nadal to język imperatywny, gdzie zupełnie przypadkiem można umieścić "statement".
Musiałem te wcięcia sobie przemyśleć (i wyspać się). Stwierdzam że to super zmiana (chociaż dalej się nie wyspałem). W zasadzie pierwsza rzecz o której pomyślałem jak zobaczyłem Rusta to Szkoda że zrobili wąsy zamiast składni bardziej w stylu Haskella
(jak pierwszy raz widziałem Scalę to jeszcze nie znałem Haskella). Wcięcia są lepsze i przejrzystsze i to jest oczywista oczywistość. Chociażby dlatego że trudniej wtedy robić 15 poziomów zagnieżdżenia :P
Scala pattern matching => JS multimethods
Tworzę sobie od jakiegoś czasu w TypeScripcie zestaw funkcyjnych bibliotek. Dzisiaj, testując swoją implementację multimetod, przerobiłem sobie Scalowy przykład pattern matchigu na wersję w JS.
Bez dalszego wstępu pokażę kod, bo przypadek dosyć ciekawy:
Wersja Scala:
abstract class Notification
case class Email(
sender: String,
title: String,
body: String
) extends Notification
case class SMS(
caller: String,
message: String
) extends Notification
case class VoiceRecording(
contactName: String,
link: String
) extends Notification
def showNotification(notification: Notification): String = {
notification match {
case Email(sender, title, _) =>
s"You got an email from $sender with title: $title"
case SMS(number, message) =>
s"You got an SMS from $number! Message: $message"
case VoiceRecording(name, link) =>
s"you received a Voice Recording from $name! Click the link to hear it: $link"
}
}
def showImportantNotification(notification: Notification, importantPeopleInfo: Seq[String]): String = {
notification match {
case Email(sender, _, _) if importantPeopleInfo.contains(sender) =>
"You got an email from special someone!"
case SMS(number, _) if importantPeopleInfo.contains(number) =>
"You got an SMS from special someone!"
case other =>
showNotification(other)
}
}
val importantPeopleInfo = Seq("867-5309", "jenny@gmail.com")
val someSms = SMS("12345", "Are you there?")
val someVoiceRecording = VoiceRecording("Tom", "voicerecording.org/id/123")
val importantEmail = Email("jenny@gmail.com", "Drinks tonight?", "I'm free after 5!")
val importantSms = SMS("867-5309", "I'm here! Where are you?")
println(showImportantNotification(someSms, importantPeopleInfo))
println(showImportantNotification(someVoiceRecording, importantPeopleInfo))
println(showImportantNotification(importantEmail, importantPeopleInfo))
println(showImportantNotification(importantSms, importantPeopleInfo))
Wersja JS:
import { multi, method } from "@arrows/multimethod"
import is from "@arrows/dispatch/is"
class Email {
constructor(sender, title, body) {
this.sender = sender
this.title = title
this.body = body
}
}
class SMS {
constructor(caller, message) {
this.caller = caller
this.message = message
}
}
class VoiceRecording {
constructor(contactName, link) {
this.contactName = contactName
this.link = link
}
}
const showNotification = multi(
method(
is(Email),
({ sender, title }) => `You got an email from ${sender} with title: ${title}`,
),
method(
is(SMS),
({ caller, message }) => `You got an SMS from ${caller}! Message: ${message}`,
),
method(
is(VoiceRecording),
({ contactName, link }) => `You received a Voice Recording from ${contactName}! Click the link to hear it: ${link}`,
),
)
const showImportantNotification = multi(
method(
(notification, info) => is(Email)(notification) && info.includes(notification.sender),
"You got an email from special someone!",
),
method(
(notification, info) => is(SMS)(notification) && info.includes(notification.caller),
"You got an SMS from special someone!",
),
method(showNotification),
)
const importantPeopleInfo = ["867-5309", "jenny@gmail.com"]
const someSms = new SMS("12345", "Are you there?")
const someVoiceRecording = new VoiceRecording("Tom", "voicerecording.org/id/123")
const importantSms = new SMS("867-5309", "I'm here! Where are you?")
const importantEmail = new Email("jenny@gmail.com", "Drinks tonight?", "I'm free after 5!")
console.log(showImportantNotification(someSms, importantPeopleInfo))
console.log(showImportantNotification(someVoiceRecording, importantPeopleInfo))
console.log(showImportantNotification(importantEmail, importantPeopleInfo))
console.log(showImportantNotification(importantSms, importantPeopleInfo))
Wyniki:
> You got an SMS from 12345! Message: Are you there?
> You received a Voice Recording from Tom! Click the link to hear it: voicerecording.org/id/123
> You got an email from special someone!
> You got an SMS from special someone!
Online editor Scala: https://scastie.scala-lang.org/keSB8BvtQkuiCTtMkTTkvQ
Online editor JS: https://runkit.com/caderek/multimethods
Myslę, że nie wygląda to źle ;)
Oczywiście pattern matching i multimetody działają zupełnie inaczej pod spodem, ale jak widać można uzyskać podobne efekty. Jak znajdę więcej czasu to zrobie wpis ogólnie o multimetodach w JS z trochę innymi przykładami (ten jest dość nietypowy).
Jak ktoś jest zainteresowany to nieśmiało skieruję do repo (dokumentacja jest jeszcze w trakcie, ale jest kilka prostszych przykładów): github repo
--
Bounusowo nieśmiertelny Fibonacci zgodnie z matematycznym wzorem - wersja na multimethodach i dla porównania w Haskellu (oczywiście nie polecam stosować rekursywnej implementacji w JS):
Haskell:
fib 0 = 0
fib 1 = 1
fib n = fib (n - 1) + fib (n - 2)
JS:
const fib = multi(
method(0, 0),
method(1, 1),
method(n => fib(n - 1) + fib(n - 2))
)
#js #scala #multimethods #pattern-matching
@Tomek-D: no, w koncu jest dzial Varia, bo ostatnio byl mocno zaniedbany.