I hereby claim:
- I am 4e6 on github.
- I am 4e6 (https://keybase.io/4e6) on keybase.
- I have a public key whose fingerprint is D79B E30D 645A 0771 2B89 BC85 87C1 6090 D691 0E91
To claim this, I am signing this object:
| /* | |
| * to run from console: | |
| * $scala DuplicatesFinder.scala /path/to/android/project | |
| */ | |
| import java.io.File | |
| import scala.xml._ | |
| val folder = args(0) | |
| val project = new File(folder) |
| package hr.the4e6; | |
| import java.io.BufferedReader; | |
| import java.io.FileNotFoundException; | |
| import java.io.FileReader; | |
| import java.io.IOException; | |
| import java.io.InputStreamReader; | |
| import java.net.MalformedURLException; | |
| import java.net.URL; | |
| import java.util.Arrays; |
| //import scala.reflect.runtime.universe._ | |
| import scala.reflect.runtime.{ currentMirror => m } | |
| import scala.tools.reflect.ToolBox | |
| import scala.tools.reflect.Eval | |
| object Test extends App { | |
| val tb = m.mkToolBox(options = "-Xprint:typer -Yshow-trees -Ydebug -Ytyper-debug") | |
| class O { class I } | |
| class A extends O { |
| jsglr-layout [scala-ast]± scala -cp org.spoofax.terms_1.0.0.201105211714.jar:bin/ | |
| Welcome to Scala version 2.10.0-20121205-235900-18481cef9b (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_17). | |
| Type in expressions to have them evaluated. | |
| Type :help for more information. | |
| scala> val tableMgr = new org.spoofax.jsglr_layout.io.ParseTableManager() | |
| tableMgr: org.spoofax.jsglr_layout.io.ParseTableManager = org.spoofax.jsglr_layout.io.ParseTableManager@1b3821a6 | |
| scala> import java.io.File | |
| import java.io.File |
| def f[T]: Unit = macro f_impl[T] | |
| def f_impl[T: c.WeakTypeTag](c: Context): c.Expr[Unit] = { | |
| import c.universe._ | |
| def isConcreteTypeSymbol(sym: Symbol) = | |
| sym.isType && !sym.asType.isAbstractType | |
| def isConcreteType(tpe: Type): Boolean = tpe match { | |
| case NoPrefix => |
| scala> val fs = Field("string") | |
| fs: Field[String] = Field(string) | |
| scala> val fi = Field(1) | |
| fi: Field[Int] = Field(1) | |
| scala> val O = Update[Object] | |
| O: Update[Object] = sparken.Update$$anon$1@4b41956d | |
| // Runtime check |
| case class Object1(field: String) | |
| case class Object2(fields: List[String]) | |
| trait CanBeMasked[T] { | |
| def mask(o: T, f: String ⇒ String): T | |
| } | |
| object CanBeMasked { | |
| implicit object O1 extends CanBeMasked[Object1] { | |
| def mask(o: Object1, f: String ⇒ String) = o.copy(field = f(o.field)) |
| class Pojo { | |
| def doStuff(): Unit = println("rocket launched!") | |
| } | |
| object Example { | |
| import NullDrivenDevelopment._ | |
| def none: Pojo = null | |
| def pojo: Pojo = new Pojo |
| Функциональные программы с производительностью императивных. | |
| Функциональный подход уже достаточно давно является трендом в современном программировании. | |
| С его помощью можно создавать абстракции, с помощью которых можно легко рассуждать о программе. | |
| Функциональные абстракции легко компоновать и в последствии переиспользовать. | |
| И это настольно легко делать, что в итоге мы создаём всё новые и новые абстракции на основе уже имеющихся, особо не задумываясь о том, как программа будет работать в рантайме. | |
| Но на практике любая абстракция, в том числе и функциональная, создаёт значительный оверхед во время выполнения. | |
| В этом докладе, на примере языка Scala, мы поговорим о том, какие же подводные камни возникают при написании функционального кода, и что можно сделать, чтобы в итоге получить эффективную программу. | |
| В качествe примера, рассмотрим Scalan, фреймворк для создания производительных DSL. И выясним, какие же проблемы получается решать на практике. |
I hereby claim:
To claim this, I am signing this object: