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:
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. И выясним, какие же проблемы получается решать на практике. |
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; |
I hereby claim:
To claim this, I am signing this object:
// JsValue remembers Adapter | |
trait JsValue { | |
type A | |
} | |
object JsValue { | |
type Aux[A0] = JsValue { type A = A0} | |
} | |
// Adapter works with JsValue of type T | |
class Adapter[T] { self => |
//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 => |