[Verbesserungsvorschlag] Macro als Procedure

Fragen und Bugreports zur PureBasic 4.0-Beta.
Benutzeravatar
Leonhard
Beiträge: 602
Registriert: 01.03.2006 21:25

[Verbesserungsvorschlag] Macro als Procedure

Beitrag 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.
Zuletzt geändert von Leonhard am 25.07.2007 07:37, insgesamt 1-mal geändert.
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Verstehe den Sinn jetzt nicht :?. Das kann man ganz einfach als Macro
umsetzen.
Bild
Benutzeravatar
Green Snake
Beiträge: 1394
Registriert: 22.02.2005 19:08

Beitrag 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)
Zuletzt geändert von Green Snake am 26.06.2006 06:58, insgesamt 1-mal geändert.
-.-"
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag 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.
Heroglyph
Beiträge: 41
Registriert: 22.11.2004 20:34

Beitrag 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).
God is real, unless declared integer.
Benutzeravatar
Leonhard
Beiträge: 602
Registriert: 01.03.2006 21:25

Beitrag 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?
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Beitrag 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
Benutzeravatar
Leonhard
Beiträge: 602
Registriert: 01.03.2006 21:25

Beitrag von Leonhard »

Schade :freak:

Aber danke für den Code von dir :allright: :allright: :allright: :allright: :allright:
Benutzeravatar
jear
Beiträge: 288
Registriert: 17.10.2004 01:59
Wohnort: Ammerland

Beitrag 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.
Man ist nie zu alt zum lernen, auch wenn man dabei manchmal alt aussieht!
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Gesperrt