Account Options

  1. Anmelden
Das alte Google Groups wird demnächst nicht mehr unterstützt. Die neue Version ist jedoch nicht kompatibel mit Ihrem Browser.
Google Groups-Startseite
« Google Groups-Startseite
Macro: is there a way to reify a spliced function?
Gegenwärtig gibt es mehrere Themen in dieser Gruppe, die zuerst angezeigt werden sollen. Damit dieses Thema zuerst angezeigt werden kann, muss diese Option bei einem anderen Thema entfernt werden.
Bei der Bearbeitung Ihrer Anfrage ist ein Fehler aufgetreten. Versuchen Sie es erneut.
Kennzeichnen
  8 Nachrichten - Alle ausblenden  -  Alles übersetzen in die Sprache: Übersetzt (alle Originale anzeigen)
Bei der Gruppe, für die Sie eine Mitteilung verfassen, handelt es sich um eine Usenet-Gruppe. Wenn Sie in dieser Gruppe Nachrichten posten, ist Ihre E-Mail-Adresse für jeden im Internet sichtbar
Ihre Antwort wurde nicht gesendet.
Die Nachricht wurde übermittelt.
 
Von:
An:
Cc:
Nachtrag zu:
Cc hinzufügen | Nachtrag hinzufügen zu | Betreff bearbeiten
Betreff:
Bestätigung:
Geben Sie zur Bestätigung die im folgenden Bild angezeigten Zeichen ein bzw. die Zahlen, die durchgesagt werden, wenn Sie auf das Barrierefreiheitssymbol klicken. Hören Sie zu und geben Sie die gehörten Zahlen ein
 
Léonard Schneider  
Profil anzeigen   Übersetzen in die Sprache: Übersetzt (Original anzeigen)
 Weitere Optionen 14 Nov. 2012, 19:36
Von: Léonard Schneider <leonard.schnei...@gmail.com>
Datum: Wed, 14 Nov 2012 16:36:15 -0800 (PST)
Lokal: Mi 14 Nov. 2012 19:36
Betreff: Macro: is there a way to reify a spliced function?

Hi,

I need to reify an expression of a spliced function. Unfortunately, reify
does not work as expected when you append a wildcard. Instead of selecting
the function which is being spliced it acts as if the spliced function were
a value.

An example to illustrate the issue.

Welcome to Scala version 2.10.0-RC2 (Java HotSpot(TM) 64-Bit Server VM,
Java 1.6.0_37).
Type in expressions to have them evaluated.
Type :help for more information.
scala> import scala.reflect.runtime.{universe=>ru}
import scala.reflect.runtime.{universe=>ru}
scala> def f(x: Int) = 0
f: (x: Int)Int
scala> val g = ru.reify(f _)
g: reflect.runtime.universe.Expr[Int => Int] =
Expr[Int => Int]({
  ((x) => f(x))

})

scala> ru.reify(g.splice _)
res0: reflect.runtime.universe.Expr[() => Int => Int] =
Expr[() => Int => Int]((() => {
  ((x) => f(x))

}))

I would have expected an Expr[Int => Int]. Is this a bug? Is there a
workaround?

Best regards,

Leo


 
Sie müssen sich anmelden, bevor Sie Nachrichten veröffentlichen können.
Bevor Sie eine Nachricht posten können, müssen Sie zunächst dieser Gruppe beitreten.
Bitte aktualisieren Sie vor dem Posten in den Abonnementeinstellungen Ihren Spitznamen.
Sie haben nicht die erforderliche Berechtigung zum Posten.
Eugene Burmako  
Profil anzeigen   Übersetzen in die Sprache: Übersetzt (Original anzeigen)
 Weitere Optionen 15 Nov. 2012, 04:38
Von: Eugene Burmako <xeno...@gmail.com>
Datum: Thu, 15 Nov 2012 01:38:22 -0800 (PST)
Lokal: Do 15 Nov. 2012 04:38
Betreff: Re: Macro: is there a way to reify a spliced function?
reify typechecks its arguments before doing any processing, so it
behaves exactly like normal Scala does:

scala> val g1 = f _
g1: Int => Int = <function1>

scala> val g2 = g1 _
g2: () => Int => Int = <function0>

Why it behaves like that is another question.

On Nov 15, 1:36 am, Léonard Schneider <leonard.schnei...@gmail.com>
wrote:


 
Sie müssen sich anmelden, bevor Sie Nachrichten veröffentlichen können.
Bevor Sie eine Nachricht posten können, müssen Sie zunächst dieser Gruppe beitreten.
Bitte aktualisieren Sie vor dem Posten in den Abonnementeinstellungen Ihren Spitznamen.
Sie haben nicht die erforderliche Berechtigung zum Posten.
Dave  
Profil anzeigen   Übersetzen in die Sprache: Übersetzt (Original anzeigen)
 Weitere Optionen 15 Nov. 2012, 06:08
Von: Dave <dave.mahabiers...@hotmail.com>
Datum: Thu, 15 Nov 2012 03:08:08 -0800 (PST)
Lokal: Do 15 Nov. 2012 06:08
Betreff: Re: Macro: is there a way to reify a spliced function?

Maybe with parentheses to force apply after lifting otherwise it means only
lifting.
Don't know if this is intended.

scala> val g2 = g1 _
g2: () => Int => Int = <function0>

scala> val g2 = g1(_)
g2: Int => Int = <function1>

scala> ru.reify(g.splice _)
res1: reflect.runtime.universe.Expr[() => Int => Int] =
Expr[() => Int => Int]((() => {
  ((x) => f(x))

}))

scala> ru.reify(g.splice(_))
res0: reflect.runtime.universe.Expr[Int => Int] =
Expr[Int => Int](((x$1) => {
  ((x) => f(x))

}.apply(x$1)))

Op donderdag 15 november 2012 10:38:29 UTC+1 schreef Eugene Burmako het
volgende:


 
Sie müssen sich anmelden, bevor Sie Nachrichten veröffentlichen können.
Bevor Sie eine Nachricht posten können, müssen Sie zunächst dieser Gruppe beitreten.
Bitte aktualisieren Sie vor dem Posten in den Abonnementeinstellungen Ihren Spitznamen.
Sie haben nicht die erforderliche Berechtigung zum Posten.
Dave  
Profil anzeigen   Übersetzen in die Sprache: Übersetzt (Original anzeigen)
 Weitere Optionen 15 Nov. 2012, 06:14
Von: Dave <dave.mahabiers...@hotmail.com>
Datum: Thu, 15 Nov 2012 03:14:01 -0800 (PST)
Lokal: Do 15 Nov. 2012 06:14
Betreff: Re: Macro: is there a way to reify a spliced function?

Or

scala> ru.reify((g.splice _).apply)
res5: reflect.runtime.universe.Expr[Int => Int] =
Expr[Int => Int]((() => {
  ((x) => f(x))

}).apply())

Op donderdag 15 november 2012 12:08:08 UTC+1 schreef Dave het volgende:


 
Sie müssen sich anmelden, bevor Sie Nachrichten veröffentlichen können.
Bevor Sie eine Nachricht posten können, müssen Sie zunächst dieser Gruppe beitreten.
Bitte aktualisieren Sie vor dem Posten in den Abonnementeinstellungen Ihren Spitznamen.
Sie haben nicht die erforderliche Berechtigung zum Posten.
Léonard Schneider  
Profil anzeigen   Übersetzen in die Sprache: Übersetzt (Original anzeigen)
 Weitere Optionen 15 Nov. 2012, 06:46
Von: Léonard Schneider <leonard.schnei...@gmail.com>
Datum: Thu, 15 Nov 2012 03:46:17 -0800 (PST)
Lokal: Do 15 Nov. 2012 06:46
Betreff: Re: Macro: is there a way to reify a spliced function?

Hi Dave,

I've tried that but it failed for my use case. So let me describe the more
general problem I'm trying to solve. Any idea or hint is welcome.

// Challenge: write macro getf such as "def g = getf[A.type]" == "def g =
A.f _" for any A object
// which contains a f method which can have any type signature
// This is just an example of an A object containing an f method
// object A {
//  def f(x: Int, s: String)
// }

def getf[T] = macro getfImpl[T]

def getfImpl[T: c.WeakTypeTag](c: Context) = {
  import c.universe._

  ???


 
Sie müssen sich anmelden, bevor Sie Nachrichten veröffentlichen können.
Bevor Sie eine Nachricht posten können, müssen Sie zunächst dieser Gruppe beitreten.
Bitte aktualisieren Sie vor dem Posten in den Abonnementeinstellungen Ihren Spitznamen.
Sie haben nicht die erforderliche Berechtigung zum Posten.
Léonard Schneider  
Profil anzeigen   Übersetzen in die Sprache: Übersetzt (Original anzeigen)
 Weitere Optionen 15 Nov. 2012, 12:53
Von: Léonard Schneider <leonard.schnei...@gmail.com>
Datum: Thu, 15 Nov 2012 09:53:36 -0800 (PST)
Lokal: Do 15 Nov. 2012 12:53
Betreff: Re: Macro: is there a way to reify a spliced function?

So here is a failed attempt to fix ideas. It shows why I've been trying to
use the splice and wildcard combination in a reify. I think my initial
question was a bad example to that regard.

scala> :pas


 
Sie müssen sich anmelden, bevor Sie Nachrichten veröffentlichen können.
Bevor Sie eine Nachricht posten können, müssen Sie zunächst dieser Gruppe beitreten.
Bitte aktualisieren Sie vor dem Posten in den Abonnementeinstellungen Ihren Spitznamen.
Sie haben nicht die erforderliche Berechtigung zum Posten.
Léonard Schneider  
Profil anzeigen   Übersetzen in die Sprache: Übersetzt (Original anzeigen)
 Weitere Optionen 16 Nov. 2012, 18:51
Von: Léonard Schneider <leonard.schnei...@gmail.com>
Datum: Fri, 16 Nov 2012 15:51:31 -0800 (PST)
Lokal: Fr. 16 Nov. 2012 18:51
Betreff: Re: Macro: is there a way to reify a spliced function?

OK. Answering myself. Here is what I came up with. It would still need to
be made more robust by dealing with nullary methods for instance. In a few
words, you have to redefine a function which takes the method values, as a
lambda expression would, to be able to use it later on. I should be able to
use the trick for automatically transform case classes into HList in my
implementation ;)

object A {
 def f(x: Int, s: String) = 0

}

def getf[T]: Any = macro getfImpl[T]
def getfImpl[T: c.WeakTypeTag](c: Context) = {
  import c.universe._
  val fSym = weakTypeOf[T].member(newTermName("f")).asMethod
  val argSyms = fSym.paramss.flatten
  val funTree = Function(argSyms.map(ValDef(_)),
treeBuild.mkMethodCall(fSym, argSyms.map(s =>
    treeBuild.mkAttributedIdent(s)
  )))
  c.Expr(funTree)


 
Sie müssen sich anmelden, bevor Sie Nachrichten veröffentlichen können.
Bevor Sie eine Nachricht posten können, müssen Sie zunächst dieser Gruppe beitreten.
Bitte aktualisieren Sie vor dem Posten in den Abonnementeinstellungen Ihren Spitznamen.
Sie haben nicht die erforderliche Berechtigung zum Posten.
Dave  
Profil anzeigen   Übersetzen in die Sprache: Übersetzt (Original anzeigen)
 Weitere Optionen 17 Nov. 2012, 06:38
Von: Dave <dave.mahabiers...@hotmail.com>
Datum: Sat, 17 Nov 2012 03:38:53 -0800 (PST)
Lokal: Sa 17 Nov. 2012 06:38
Betreff: Re: Macro: is there a way to reify a spliced function?

Amazing. Well done!

C:\Users\Dave>scala

Op zaterdag 17 november 2012 00:51:31 UTC+1 schreef Léonard Schneider het
volgende:


 
Sie müssen sich anmelden, bevor Sie Nachrichten veröffentlichen können.
Bevor Sie eine Nachricht posten können, müssen Sie zunächst dieser Gruppe beitreten.
Bitte aktualisieren Sie vor dem Posten in den Abonnementeinstellungen Ihren Spitznamen.
Sie haben nicht die erforderliche Berechtigung zum Posten.
Ende der Nachrichten
« Zurück zu Diskussionen « Neueres Thema     Älteres Thema »