Andere Vorgehensweise, auf PB-Funktionen zuzugreifen

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Andere Vorgehensweise, auf PB-Funktionen zuzugreifen

Beitrag von RSBasic »

Hola,

in einigen anderen Programmiersprachen greift man beispielsweise auf eine Funktion (bzw. Methode) so zu:

Code: Alles auswählen

Console.WriteLine(Math.Abs(-54));
Vorteil: Ohne in die Hilfe schauen zu müssen, hat man dank der Autovervollständigungsliste alle Funktionen einer bestimmten Bibliothek.
In PureBasic muss man den Funktionsnamen kennen, aber warum kann man das bei PB nicht ebenfalls so aufbauen, so dass man genau so zugreifen kann, wie oben im Beispielcode gezeigt?
Man kann zwar einen beliebigen Anfangsbuchstabe schreiben, aber es werden alle Funktionen aller Bibliotheken aufgelistet, die mit Hilfe des eingegebenen Anfangsbuchstabens gefunden wurden.

Da bekam ich eine Idee mit DeclareModule. Die in einem Modul definierten Variablen/Prozeduren werden ebenfalls in der Autovervollständigungsliste angezeigt.
Damit könnte man folgendes realisieren:

Code: Alles auswählen

Debug Math::Abs(-54)
Wenn man nur "Math::" eingibt, dann sieht man folgende Autovervollständigungsliste:
Bild

Vorausgesetzt es sind auch die jewieligen PB-Funktionen im Modul als Variablennamen definiert.

Wie findet ihr diese Idee?
Ich finde es irgendwie praktischer. Man schreibt den Namen der gewünschten Bibliothek und es werden alle Funktionen aus dieser Bibliothek angezeigt, die man mit der Tabulatortaste auswählen kann, so wie man es in einigen anderen Programmiersprachen kennt.

Falls man gerne die Beschreibung einer Funktion lesen möchte, dann ist die Hilfe natürlich unentbehrlich, aber wenn man gerne auf eine beliebige Funktion einer bestimmten Bibliothek zugreifen möchte, könnte man es doch so machen.
Ist sowas eurer Meinung nach sinnvoll oder seid ihr der Meinung, man braucht es eigentlich nicht?

Ihr könnt es gerne mal ausprobieren, indem ihr die folgende Include-Datei einbindet und versucht, auf bestimmte Bibliotheken und Funktionen zuzugreifen.

Code: Alles auswählen

EnableExplicit

DeclareModule Math
  Macro ACos : ACos : EndMacro
  Macro ACosH : ACosH : EndMacro
  Macro ASin : ASin : EndMacro
  Macro ASinH : ASinH : EndMacro
  Macro ATan : ATan : EndMacro
  Macro ATan2 : ATan2 : EndMacro
  Macro ATanH : ATanH : EndMacro
  Macro Abs : Abs : EndMacro
  Macro Cos : Cos : EndMacro
  Macro CosH : CosH : EndMacro
  Macro Degree : Degree : EndMacro
  Macro Exp : Exp : EndMacro
  Macro Infinity : Infinity : EndMacro
  Macro Int : Int : EndMacro
  Macro IntQ : IntQ : EndMacro
  Macro IsInfinity : IsInfinity : EndMacro
  Macro IsNaN : IsNaN : EndMacro
  Macro Log : Log : EndMacro
  Macro Log10 : Log10 : EndMacro
  Macro Mod : Mod : EndMacro
  Macro NaN : NaN : EndMacro
  Macro Pow : Pow : EndMacro
  Macro Radian : Radian : EndMacro
  Macro Random : Random : EndMacro
  Macro RandomData : RandomData : EndMacro
  Macro RandomSeed : RandomSeed : EndMacro
  Macro Round : Round : EndMacro
  Macro Sign : Sign : EndMacro
  Macro Sin : Sin : EndMacro
  Macro SinH : SinH : EndMacro
  Macro Sqr : Sqr : EndMacro
  Macro Tan : Tan : EndMacro
  Macro TanH : TanH : EndMacro
EndDeclareModule
Module Math : EndModule

;...
Vollständiger Code: http://www.rsbasic.de/downloads/downloa ... greifen.pb
Bild
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Andere Vorgehensweise, auf PB-Funktionen zuzugreifen

Beitrag von STARGÅTE »

Im Prinzip läuft es doch wieder auf das Duell Präfix vs. Suffix hinaus.

PureBasic benutzt seit Begin den Librarynamen als Suffix: LoadImage was der einfachen Sprache: "lade Bild" nahe kommt.
Andere Sprachen nutzen stattdessen den Librarynamen als Präfix: ImageLoad ggf. sogar nicht Unterstrich.

Die Vorteile der Präfix-Schreibweise für Autovervollständigung sehe ich durchaus ein, ich finde allerdings die Suffix-Schreibweise sehr viel angenehmer zu lesen.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Andere Vorgehensweise, auf PB-Funktionen zuzugreifen

Beitrag von edel »

STARGÅTE hat geschrieben: PureBasic benutzt seit Begin den Librarynamen als Suffix: LoadImage was der einfachen Sprache: "lade Bild" nahe kommt.
Ne, leider nicht. Um bei deinem Beispiel zu bleiben :

Code: Alles auswählen

ImageWidth
ImageHeight
und das zieht sich durch alle Libs.
RSBasic hat geschrieben: Nachteil: Mir ist aufgefallen, dass man Variablen, die man an Funktionen übergibt, vorher im jeweiligen Modul definieren muss. Gibt es da einen Trick zum Umgehen?
Wenn ich dich richtig verstanden haben, dann mit Macros.

Code: Alles auswählen

DeclareModule Array
  Macro ArraySize(a)
    ArraySize(a)
  EndMacro 
  
EndDeclareModule : Module Array : EndModule

Dim a(10)
Debug Array::ArraySize(a())
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Andere Vorgehensweise, auf PB-Funktionen zuzugreifen

Beitrag von RSBasic »

STARGÅTE hat geschrieben:PureBasic benutzt seit Begin den Librarynamen als Suffix: LoadImage was der einfachen Sprache: "lade Bild" nahe kommt.
Das ist meistens nicht der Fall. Beispielsweise die Math-Bibliothek hast du weder ein Präfix (MathAbs) noch ein Suffix (AbsMath).
edel hat geschrieben:Wenn ich dich richtig verstanden haben, dann mit Macros.

Code: Alles auswählen

DeclareModule Array
  Macro ArraySize(a)
    ArraySize(a)
  EndMacro 
  
EndDeclareModule : Module Array : EndModule

Dim a(10)
Debug Array::ArraySize(a())
Cool, vielen Dank. :allright:

Ich habe den oberen Code angepasst.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Andere Vorgehensweise, auf PB-Funktionen zuzugreifen

Beitrag von GPI »

Code: Alles auswählen

DeclareModule Array
  Macro ArraySize(a)
    ArraySize(a)
  EndMacro 
  
EndDeclareModule : Module Array : EndModule

Dim a(10)
Debug Array::ArraySize(a())
Blöde Frage, aber wäre es nicht sinnvoller:

Code: Alles auswählen

DeclareModule Array
  Macro Size(a)
    ArraySize(a)
  EndMacro 
  
EndDeclareModule : Module Array : EndModule

Dim a(10)
Debug Array::Size(a())
Zu schreiben? Das doppelte Array (Array::ArraySize()) sieht etwas dumm aus.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Andere Vorgehensweise, auf PB-Funktionen zuzugreifen

Beitrag von RSBasic »

Ich wollte die originalen Funktionsnamen 1:1 übernehmen, die man bereits kennt.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: Andere Vorgehensweise, auf PB-Funktionen zuzugreifen

Beitrag von c4s »

Insgesamt gefällt mir die Idee von RSBasic. Aber ich muss GPI zustimmen, dass die doppelten Bezeichnungen überflüssig sind.

Ist es eigentlich möglich beim Compiler die unterstützten Funktionsnamen nur für eine bestimmte Bibliothek abzufragen oder geht nur alles auf einmal? Ich frage, weil wenn ersteres möglich wäre, könnte man es ganz einfach automatisiert erstellen lassen (und bei neuen/geänderten Namen ohne Probleme aktualisieren).
Zumindest ich (und wohl auch GPI) würde dann noch standardmäßig jeweils den Namen der Bibliothek aus dem Funktionsnamen entfernen lassen, d.h. bei bspw. "Array" wird ArraySize() ganz einfach zu Array::Size() oder bei "File" von CloseFile() zu File::Close().

Hui, der Gedanke gefällt mir wirklich gut! Stellt euch vor das ginge auch noch mit Konstanten, z.B. Window::Open(Window::#PB_SystemMenu) ... Damit wäre auf ganz einfache Weise die kontextsensitive Autovervollständigung (Link zum englischen Feature-Request) implementiert. :allright:
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Andere Vorgehensweise, auf PB-Funktionen zuzugreifen

Beitrag von GPI »

c4s hat geschrieben: Window::Open(Window::#PB_SystemMenu)
Hier würde ich sogar noch ein Schritt weitergehen und die Konstante Window::#SystemMenu nennen - das #PB wäre dann überflüssig.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
TroaX
Beiträge: 661
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Pop_OS! | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Pop_OS!
Wohnort: NRW
Kontaktdaten:

Re: Andere Vorgehensweise, auf PB-Funktionen zuzugreifen

Beitrag von TroaX »

Generell finde ich den Vorschlag garnicht mal so übel. Ich habe da auch schon dran gedacht, ob das nicht besser wäre. Bei PHP habe ich es mit MS Visual Code über einen Präfix und nem underscore gelöst z.B. Template_LoadSubtemplate() oder Cache_SaveArray(). Diese habe ich mir dann im Editor in die Autovervollständigung übernommen (was bei dem Editor einfach nur traumhaft funktioniert :) ). Ich hätte es auch mit statischen Klassen machen können (wie es ja PB entfernt mit Modulen unterstützt), aber auf die Idee bin ich leider zuspät gekommen :lol:

Ich finde die Idee aber wie gesagt gut. Noch besser wäre natürlich ein richtiges Intellisense, das einem auch Infos über Rückgabewert und Parameter liefert. Aber ich glaub das wird in diesem Leben nichts mehr in PB :D
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Pop_OS!
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Pop_OS!
NAS: Fritz.Box :lol:
Coding: Purebasic 6.04 | PHP | HTML | CSS | Javascript
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: Andere Vorgehensweise, auf PB-Funktionen zuzugreifen

Beitrag von c4s »

GPI hat geschrieben:
c4s hat geschrieben: Window::Open(Window::#PB_SystemMenu)
Hier würde ich sogar noch ein Schritt weitergehen und die Konstante Window::#SystemMenu nennen - das #PB wäre dann überflüssig.
Ja, da hast du wohl Recht.

Das einzige Problem bei dem Ganzen ist, dass beim Umbenennen die Schnellhilfe bzgl. benötigter Parameter (sichtbar in der Statusleiste) nicht mehr funktioniert. Hierbei würde es helfen, wenn man, wie TroaX meint, eigene Hilfetexte erstellen könnte (wieder Link zu einem Feature-Request).
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Antworten