Seite 1 von 2

[Verbesserungsvorschlag] Macro als Procedure

Verfasst: 25.06.2006 20:27
von Leonhard
Ich fänd es super, wenn man ein Macro so ählich wie eine Procedure benutzen kann. z.B.:

Code: Alles auswählen

ProcedureMacro.b IsIf(IfBegingung)
	If IfBegingung
		ProcedureReturn #True
	Else
		ProcedureReturn #False
	EndIf
EndProcedureMacro

Debug IsIf(a > 10)
Damit könnte mann sich eine mänge Code sparen. Der unterschied ist hier, das der Macro-Code als Procedure-Code menutzt wird. Leider kann ich das nicht irgendwie umsetzten.

Verfasst: 25.06.2006 20:31
von MVXA
Verstehe den Sinn jetzt nicht :?. Das kann man ganz einfach als Macro
umsetzen.

Verfasst: 25.06.2006 20:37
von Green Snake
Ich denke er meint eher Inline - Prozeduren...

Edit:

Beispiel:

Code: Alles auswählen

Macro Test(Var)
  Var * 500
  Var - 5 ;Diesen Wert will ich.
EndMacro

Debug Test(10)
Geht nicht....Bei Inline könnte mans so machen:

Code: Alles auswählen

ProcedureInline Test(Var)
  Var * 500
  ProcedureReturn Var - 5 ;Diesen Wert will ich.
EndProcedure

Debug Test(10)

Verfasst: 25.06.2006 20:45
von remi_meier
Nö.
Er meint, dass das gleiche Preprocessing, das bei Makros gemacht wird,
auch für Prozeduren möglich ist, Bsp:

Code: Alles auswählen

MacroProc a(b)
  If b
  EndIf
EndMacroProc

a(z < 5)

; würde dann eine prozedur
Procedure a(z)
  If z < 5
  endif
Endprocedure

; erzeugen
Habe ich in noch keiner Sprache gesehen. Viel zu komplex, kannst das
wohl vergessen.

Verfasst: 26.06.2006 04:24
von Heroglyph
Diese Erklärung macht aber imho keinen Sinn.
Wenn das Makro direkt durch die Prozedur ersetzt wird... dann könnte man wohl auch einfach gleich die Prozedur hinschreiben.

Dann macht die inline-Variante schon mehr Sinn, weil man dort Zeit für einen Aufruf sparen kann (und natürlich unter Umständen sogar mehr, wenn die Prozedur auf einer anderen Seite im Speicher liegt oder nicht im Cache ist).

Verfasst: 26.06.2006 08:24
von Leonhard
Heroglyph hat geschrieben:Wenn das Makro direkt durch die Prozedur ersetzt wird... dann könnte man wohl auch einfach gleich die Prozedur hinschreiben.
Neee.

Funzt nicht. Ich meine, das wie eine Procedure funktioniert. Nur das die Parameter genauso wie in einem Macro verwendet werden. z.B.:

Code: Alles auswählen

MacroProc.b IsIf(bedingung) 
  If bedingung
    MacroProcReturn #True
  Else
    MacroProcReturn #False
  EndIf
EndMacroProc 

a.b=IsIf( 100 > 10 )

; Bei a sollte jetzt #False reingeschrieben sein. Da 100 > 10 nicht stimmt.
Debug a
Jetzt verstanden?

Verfasst: 26.06.2006 08:51
von helpy
Ja, stimmt! Das wäre nett, wenn das gehen würde. Tut es aber nicht. Der Vorschalg ist aber schon alt und wurde schon mal vor längerer Zeit gebracht.

Für das obige IsIf() gibt es aber eine Lösung:

Code: Alles auswählen

Macro IsIf( bedingung )
	( #False Or ( bedingung ) )
EndMacro
cu, helpy

Verfasst: 27.06.2006 18:20
von Leonhard
Schade :freak:

Aber danke für den Code von dir :allright: :allright: :allright: :allright: :allright:

Verfasst: 27.06.2006 23:55
von jear
Irgendwie komme ich nicht dahinter, was hier von Leonhard eigentlich gewollt wird.
Es scheint mir aber ein grundsätzliches Missverständnis darüber vorzuliegen, was ein Macro kann und was er nicht kann.
Letztlich ist ein Macro nicht viel mehr als die Ersetzung eines Textes in der Quelle bevor der Compiler diese übersetzt.
Das was zusätzlich drin ist, ist die Übergabe der Argumente an diesen Ersetzungsprozess. Diese Übergabe findet aber auf einer Abstraktionsebene statt, die bei Prozeduren so nicht möglich, vor allen Dingen aber nicht sinnvoll ist. Bei Prozeduren können nur Adressen und Konstanten übergeben werden, die zur Laufzeit auf dem Stack abgelegt und innerhalb des Prozedur-Codes abgearbeitet werden können.
Bei Macros findet die Übergabe hingegen quasi als String statt, der vom Compiler interpretiert werden kann. Nur deswegen ist die Übergabe eines Ausdruckes wie "a > b" überhaupt sinnvoll und möglich.
Dies geht bei Prozeduren nicht. Es macht keinen Sinn den String "a > b" zur Laufzeit an eine Prozedur zu übergeben, denn diese hat keine Möglichkeit mehr, den Ausdruck aufzulösen, es sei denn, sie enthält einen kompletten Interpreter, der auf alle möglichen Kombinationen vorbereitet ist, die zur Übersetzungszeit zulässig sind.
Mit anderen Worten, eine solche Prozedur müsste prüfen, welche Variablen mit welchen Operatoren zu verknüpfen sind, die typische Aufgabe eines Compilers also eingebettet in den Code.

Verfasst: 28.06.2006 08:31
von Kaeru Gaman
genau.

ich würde da woanders ansetzen:
für welche problemstellung wäre es denn notwendig,
einen vergleichsausdruck an eine prozedur zu übergeben?

bestimmt kann man eine praktikablere lösung finden.

die übergabe von vergleichsausdrücken ist meines wissens in keiner sprache üblich.