Bejelentkezés

Keresés a fórumban

Kulcsszó
Szoftver trükkök

TÉMA: Programnyelvem lényegében készen van!

Programnyelvem lényegében készen van! 2019 jan. 06 05:05 #2307

  • FossilCodger
  • FossilCodger profilkép
  • Nem elérhető
  • Arany fokozatú fórumozó
  • Hozzászólások: 209
  • Köszönetek: 6
  • Karma: 0
Hi, rég jártam itt. (Mert nem volt visszajelzés...) Csak gondoltam ha korábban annyit írkáltam ide, azt még leírom, hogy programnyelvem VÉGRE lényegében készen van! Persze, igazán sose lesz készen, ilyesmit nem lehet befejezni csak abbahagyni...
Mindegy, a lényeg hogy nemcsak Turing-teljes (ami önmagában véve még nem volna egy nagy szám) de remekül alkalmazható és a satöbbi meg a minden, hehehe.
Még bele kell raknom pár eddig mellőzött ficsőrt a stringkezeléssel kapcsolatban (no ne ijedjetek meg, tud már stringeket kezelni, csak pár ritkább funkcióhoz még nem gyártottam kulcsszót), aztán még berakom a directorykezelést is. Mindezekhez már megvannak a megfelelő függvények, megírtam és kipróbáltam őket, csak most valamiféle API-szerűséget kell definiálnom nekik, bár lehet hogy nem az API a legmegfelelőbb szó. Lényegében csak arról van szó, melyik kulcsszót találjam ki a nyelvembe az adott funkcióhoz, és milyen paramétersorrendet óhajtok meg ilyesmi. Ezt már könnyen és hamar megoldom, akár 40 fokos lázban fetrengve is.

A lényeg a lényeg: végülis sok kísérlet és korábbi nyelvek után ami mellett elköteleztem magamat, az egy RPN szintaxisú/logikájú nyelv lett, bár akad benne pár (nem sok) kivétel. Szemre azaz vizuálisan kb úgy néz ki egy avatatlannak, mintha a Forth nyelvet ötvözték volna a régi Ti-59 programozható zsebszámológép nyelvével. Ellenben iszonyatosan gyors! Általában csak hatszor...tizenkétszer lassabb mint a natív kód, ami egy interpretertől egyszerűen ELKÉPESZTŐ sebesség!

Oké, elismerem, tanulni kell, nem a lusta Kóder Trógereknek készült, meg nem is a kezdő padawanoknak akik évekig azon meditálnak melyik nyelvet kezdjék tanulniu, ahelyett hogy nekiállnának végre a tanulásnak... Ja, ez a nyelvem teljes egészében tiszta C nyelven íródott, nincs benne semmi C++. Ebből már remélem tudjátok, ha nem bannoltak volna a HUP-on akkor a mostani szavazáson melyikre szavaztam volna mint „Kedvenc fordított programozássi nyelvre”.

Itt egy példa, ez kiírja az összes parancssori paraméterét az stdout-ra:
suggestedmem 1
20 mem sto! @0
"Commandline parameters:\n"
@0 argc {| {} #g print ". = " argv #s printnl |} drop
rcl @0 inv mem
end

Ez meg kirajzolja a konzolra a Mandelbrot-fraktált karakteresen (sőt, még benchmarkolja is):
suggestedmem 100
goto §kezd
idő: "Time: "
ticktext: " tick.\n"
kezd:
tick sto! @0
#d
-39. sto! @1
78 {|
nl
-39. sto! @2
78 {|
rcl @2 40. / sto! @3
rcl @1 40. / sto! @4
sbr §mandelbrot
#g
dup !{ drop
7 !/ 4 >= { '*  goto §kiírja }
goto §spckiír }
$28 + dup 127 > { drop
spckiír:
32 } kiírja: #k print!
#d
1. sum! @2
|}
1. sum! @1
|}
nl
#g
tick rcl @0 -
§idő strprint print drop §ticktext strprint
end

mandelbrot:
rcl @4 0.5 - sto! @15
mov @16 @3
0. sto @17 sto! @18
0. sto  @32
   sto! @33
{... // begin the infinite loop
rcl @18 rcl @17 * sto @20
rcl @18 inv sqr sto @21
rcl @17 inv sqr sto @33
- rcl @15 + sto! @18
dup rcl @16 !+ sto! @17
rcl @33 rcl @21 + 16. > { {...} rts }
{...} #g 1000 > { rcl @33 (#g) rcl @21 (#g) #g + 0 rts }
#d
...} // end of the infinite loop

Ja, a nyelvem neve még mindig: UPU. Az UPU programnyelv neve egy rövidítés, azt jelenti (sok mást is de elsősorban azt) hogy:

Ubiquitous Programming Utility

Persze ha tudjuk is hogy ezt jelenti, felmerül a kérdés, miért épp ezt választottam? Nos amiatt mert regényíró vagyok, sci-fi szerző, egy több mint 50 regényt tartalmazó sorozat van már a hátam mögött (bár nem mindegyik tagja jelent már meg), de még tervezek újakat is írni. S abban a műben amit épp most írok, szerepel egy csillagbirodalom UPU néven. Ott az UPU annak a rövidítése, hogy „United Planets of Universe”, a lakói természetesen angolul beszélnek, tekintve hogy birodalmuk neve se véletlen: ők a jelenkori USA jogutódai…
Művemben ők ezt a programnyelvet használják - interpreterként legalábbis - az egész birodalomban, mint afféle „hivatalos”, „állami” programnyelvet. Tudomásom szerint én vagyok az egész Világon az EGYETLEN olyan regényíró, aki egy kész, működőképes PROGRAMnyelvet is elkészített a sorozatához!
Tehát, irodalmi/esztétikai céllal készült emberi nyelvek akadnak szépszámmal. De irodalmi céllal készült programnyelvről nem tudok.

A nyelvem természetesen rengetegféle elemi típust támogat alapból, nemcsak a lebegőpontos számokat és a stringeket. Ami a fenti példákat illeti, a forráskód tördelése (ha úgy tetszik indentálása) gyakorlatilag éppoly szabad mint a C/C++ esetében, szóval nem kötött mint a Python esetében. A Pythontól rángógörcsbe kerül minden agytekervényem ha csak rágondolok... Nem az én esetem. Ha én programozni akarok, akkor a kódot óhajtom írni, és nem valamiféle táblázatszerkesztéshez vagy szövegszerkesztéshez hasonló dolgot csinálni hogy formázgassam holmi tabulátorokkal meg szóközökkel, mintha nem is programozó lennék hanem kiadványszerkesztő!

Megjegyzem, eddig minden tesztben gyorsabb a nyelvem mint a Python, néha igazán nem kevéssel!

A nyelvemnek kb semmi függősége nincs a gcc és a standard libek kivételével, illetve ehhez még hozzájöhet az alsalib és az xlib is, bizonyos speciális feladatokhoz, de ezek nélkül is lefordítható. Nem tartom lehetetlennek hogy a későbbi fejlesztések során ezekhez még a libpng is hozzájön, de az is csak így opcionálisan.

Hogy miért RPN? Mert gyors. Sokkal gyorsabb mint azok a nyelveim amelyekben infix jelölésrendszert alkalmaztam, pláne ha még az operátor-precedenciára is kellett ügyelnem. Továbbá, rájöttem hogy az RPN még logikusabb és természetesebb is bizonyos értelemben...

Ha a fenti kódok alapján valami rém primitív vacakságra gondolnátok, elárulom, ez legfeljebb részben igaz. Például ami a stringeket illeti, az efféle bonyolult struktúrákkal rendelkező objektumszerűségeknél (nálam ugyanis a string nem egy záróbájtos karakterlánc hanem egy hossztárolós objektum lényegében) ezeknél tehát csak az inicializáló memóriaalokációt és a megszüntetéskor a deallokációt kell „kézzel” elvégezni, használat közben az esetleg szükségessé váló reallokációt már maga az interpreter végzi automatikusan, beleértve a szükséges másolgatásokat s egyebeket is. Azaz, ilyen szempontból a nyelvem sokkal kényelmesebb mint a C a pointereivel (bár az én nyelvem is alapvetően pointer-orientált), bár nem annyira kényelmes mint a C++. Valahol a kettő közt lehet. Annyit azért magam is elismerek, hogy én se merném igazán magas szintűnek nevezni, de ez nem is volt a célom.

Na ennyi elég is lesz, úgyis kérdéses elolvassa-e valaki...

Programming is like using toilets; you can't say you are done until paperwork's finished!
Nyilvános megtekintési jogosultság letiltva.

Programnyelvem lényegében készen van! 2019 jan. 11 01:41 #2308

  • FossilCodger
  • FossilCodger profilkép
  • Nem elérhető
  • Arany fokozatú fórumozó
  • Hozzászólások: 209
  • Köszönetek: 6
  • Karma: 0
Íme egy csinos kis Brainfuck interpreter, a Drágaszág nyelvén (azaz UPU nyelven) írva, mert "Egy nyelv mind fölött, egy nyelv kegyetlen...". Ez bemutatja azt is hogy lehet benne akár tömböket is használni, címkéket, mindent:
suggestedmem 20 #g
20 mem sto! @0 100000 mem sto! @1
argc 3 < { "Usage: upu brainfuck08.upu brainfuckpgm.brainfuck\n" sbr §invmem fail }
@0 2 argv #s
// "The name of the brainfuckfile for execute: " printnl
'f istrue !{ "The file is not exists!\n" sbr §invmem fail }
// Load the file into @1 :
@1 @0 fileinput
tick sto! @2 // starting tick
sbr §brainfukk // The stringvariable of the brainfukk pgm being executed should be in the stack for the subrutine.
nl
#g tick rcl @2 - §idő strprint print! §ticktext strprint sbr §invmem
end
invmem: rcl @0 inv mem rcl @1 inv mem rts
idő: "Time: "
ticktext: " tick.\n"
// ========================================
brainfukk:
sto @9 // save the brainfukkpgm-variable as copy
#g ~ !{ rts }       // If the length of the brainfukk pgm is zero, then nothing to do.
rcl @9 ~~~ sto! @4  // Length of the working memory in sizeof #g
zero @6 zero @7
rcl @9
mainloop:
rcl @6 rcl @9 ~ >= then §droprts
rcl @6 []
$ff & §jumpingtable [goto]

____: inc @6 goto §mainloop
_3c_: rcl @7 !{ rts } dec @7 inc @6 goto §mainloop
_3e_: rcl @7 rcl @9 ~ >= then §droprts inc @7 inc @6 goto §mainloop
_2b_: rcl @9 rcl @7 [:] c++ goto §minusba
_2d_: rcl @9 rcl @7 [:] c-- minusba: rcl @7 swap <:> drop goto §____
_2e_: rcl @9 rcl @7 [:] #a print! #g drop goto §____
_2c_: rcl @9 rcl @7 getchar <:> drop goto §____
// ...............
_5b_: rcl @9 rcl @7 [:] swap drop then §____
          zero @11
          rcl @9 rcl @6 ++ rcl @9 ~ {||
          [{}] '[ == { inc @11 {<} }
          [{}] '] == { rcl @11 !{ {+} sto! @6 {>} }
          dec @11
          }
|} drop goto §mainloop
// ...............
_5d_: zero @11 rcl @9 1 rcl @6 {|| [{-}] '] == { inc @11 {<} }
          [{-}] '[ == {
          rcl @11 !{ {} inv sum! @6 {>} } dec @11
          }
|} drop goto §mainloop
// ...............
droprts: drop rts
// ...............

jumpingtable:
//         00    01    02    03    04    05    06    07    08    09    0a    0b    0c    0d    0e    0f
/* 00 */ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____
/* 01 */ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____
/* 02 */ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §_2b_ §_2c_ §_2d_ §_2e_ §____
/* 03 */ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §_3c_ §____ §_3e_ §____
/* 04 */ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____
/* 05 */ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §_5b_ §____ §_5d_ §____ §____
/* 06 */ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____
/* 07 */ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____
/* 08 */ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____
/* 09 */ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____
/* 0a */ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____
/* 0b */ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____
/* 0c */ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____
/* 0d */ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____
/* 0e */ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____
/* 0f */ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____

Programming is like using toilets; you can't say you are done until paperwork's finished!
Utolsó szerkesztés: 2019 jan. 11 01:52 Írta: FossilCodger.
Nyilvános megtekintési jogosultság letiltva.

Programnyelvem lényegében készen van! 2019 jan. 17 03:14 #2309

  • FossilCodger
  • FossilCodger profilkép
  • Nem elérhető
  • Arany fokozatú fórumozó
  • Hozzászólások: 209
  • Köszönetek: 6
  • Karma: 0
Kedves Nonexistent Olvasóim, csak hogy lássátok a nyelvemen igenis lehet írni HASZNOS
programokat, tudatlak benneteket hogy az imént készültem el egy nice tiny
progival, amit máris használok rendszeresen, tudniillik azt csinálja
hogy kilistázza az aktuális könyvtár tartalmát nekem. Vagy nem az
aktuálisét, mert még szép hogy meg lehet neki adni parancssori
paramétert is hogy mit listázzon... Külön színnel jelöli ha a file
végrehajtható, illetve a symlinknél azt ha törött, persze symlinknél
azt is kijelzi hogy mire mutat az a symlink, a fileméretet
helyiértékhelyesen listázza ráadásul külön színekkel a helyiértékek
ezres csoportjait, a végére méretösszesítést is ír, és 3 külön
csoportban listáz: külön az alkönyvtárakat, a reguláris fájlokat és a
symlinkeket! (Nyilván mindegyik csoportot csak akkor, ha van benne
legalább 1 tétel). A csoportokon belül pedig ABC sorrendben! Mindigis
gyűlöltem tudod ha a lista összevissza van, de azt is ha úgy rendezik
hogy a különböző típusok összekeverednek). A jogosultságokat oktálisan
listázza, mert egy Igaz Kocka azt úgy szereti látni. Most bemásolom
ide a szkriptet (nem is hosszú) de ne feledd el ránézni a
csatolmányra is, mert csatolva külkdök egy screenshotot is!

Íme, Voilá, Behold:
suggestedmem 10
12 mem sto! @0
12 mem sto! @2
@0 #g argc 3 >= !{ §defaultdir =§ goto §folyt } 2 argv
folyt:
'd istrue !{ "The given directory doesn't exists!\n" rcl @0 inv mem
rcl @2 inv mem fail }
dir sto! @1
@1 @0 loaddir dup { "Error! Errorcode = " #g printnl fail } drop
drop // (töröltük a @1 -et a stackból)
// ===================================================================================
DIRECTORIES
zero @6
@1 'D amount {_ 35 printcolor 4 printcolor "Subdirectories:"
colorreset space 9 printcolor
#g printnl colorreset
{|
'D {} sbr §octal
// @2 @1 'D {} filesize #g (#s) #s print! // Filesize isn't important
in case of DIRs
10 printcolor 2 {| space |}
@2 @1 'D {} filename 63 stub #s print!
{} 'D sbr §ownersandtime
|}
}{ drop }
// ===================================================================================
REGULAR FILES
@1 'R amount {_ 35 printcolor 4 printcolor "Common files:" colorreset
space 9 printcolor
#g printnl colorreset
{|
@1 'R {} executable sto! @6
'R {} sbr §octal
@2 @1 'R {} filesize #g (#s) 14 15 13 12 coloredsize #s print! colorreset space
6 printcolor rcl @6 { 2 printcolor }
@2 @1 'R {} filename
63 stub  print!
{} 'R sbr §ownersandtime
|}
#g
"--------------------------\n"
@2 @1 'R totalsize "TotalSize = " #g (#s) noleftspc 14 15 13 12
coloredsize #s space printnl!
}{ drop }
// ===================================================================================
SYMLINKS
@1 'L amount {_ 35 printcolor 4 printcolor "Symlinks:" colorreset
space 9 printcolor
#g printnl colorreset
{|
@1 'L {} broken sto! @6
'L {} sbr §octal 2 {| space |}
rcl @6 !{ 8 }{ 13 } printcolor
@2 @1 'L {} filename 20 stub #s print!
rcl @6 !{ 10 printcolor }{ 21 printcolor 10 printcolor }
" ===> " colorreset space
rcl @6 !{ 8 }{ 13 } printcolor
@2 @1 'L {} destination #s print!
colorreset
nl
|}
}{ drop }
rcl @0 inv mem
rcl @1 inv mem
rcl @2 inv mem
nl
end
// ........................................................
defaultdir: "."
// ........................................................
octal: #g sto! @8 sto! @9 @2 @1 rcl @9 rcl @8 octal
colorreset
rcl @6 { 9 }{ 7 } printcolor
#s print! colorreset
rts
// ........................................................
ownersandtime:
colorreset
sto! @9 sto! @8
space 24 printcolor 6 printcolor
@2
@1 rcl @9 rcl @8 ownername 6 stub print ":"
@1 rcl @9 rcl @8 groupname 6 stub print
colorreset space
@1 rcl @9 rcl @8 mtime print
drop nl
rts
// ........................................................

Programming is like using toilets; you can't say you are done until paperwork's finished!
Nyilvános megtekintési jogosultság letiltva.

Programnyelvem lényegében készen van! 2019 jan. 26 23:15 #2317

  • FossilCodger
  • FossilCodger profilkép
  • Nem elérhető
  • Arany fokozatú fórumozó
  • Hozzászólások: 209
  • Köszönetek: 6
  • Karma: 0
Csak gondoiltam szólok röviden, megoldottam azt is (nem is volt nehéz megoldani) hogy lehessen változóneveket is használni az UPU nyelvben. Azaz nem csak memóriacímeket mint @145 például, de ilyesmit is, hogy:
@Végső_Összeg

A két módszer - a memóriacímes és a változóval megadott - vegyesen is alkalmazható. Természetesen a változónevekből is memóriacímek lesznek végső soron, de ezt a compiler intézi el. A változókat nem kell külön deklarálni, ennek ellenére azonban nem az első használatkor jönnek létre, hanem a program betöltésekor rögvest, épp amiatt mert már a fordítási folyamat során felderíti őket a compiler.

Programming is like using toilets; you can't say you are done until paperwork's finished!
Nyilvános megtekintési jogosultság letiltva.

Programnyelvem lényegében készen van! 2019 jan. 28 15:07 #2320

  • FossilCodger
  • FossilCodger profilkép
  • Nem elérhető
  • Arany fokozatú fórumozó
  • Hozzászólások: 209
  • Köszönetek: 6
  • Karma: 0
Megírtam a nyelvemen a „vidir” programot, nálam diredit a neve.
Eredetileg Perl nyelven íródott. Ez már a legkifejezettebben hasznos
program! Itt van róla leírás:
linux.die.net/man/1/vidir
Lényege, hogy a megadott tartalomjegyzéket a $EDITOR környezeti változóban meghatározott editorral szerkeszthetjük. Ehhez létrehoz egy ideiglenes fájlt, aztán amikor a szerkesztést befejeztük, azt beolvassa, ami abban nincs de a tartalomjegyzékben szerepelne azt kitörli, ami pedig megvan de más néven, azt átnevezi. Az azonosításhoz
sorszámokat generál a fájl sorainak elejére. Hát ezt megírtam magam is, és nem kell hozzá már Perl nyelv.
E programot egy vv nevű pici szkripttel indítom, aminek tartalma csak ennyi:
#!/bin/bash
$HOME/UPU/upu $HOME/UPU/useful/diredit.upu "$@"

Lássuk a teljes programot!
 6 mem >>> @defaulteditor §EDITOR =§ env drop
 6 mem >>> @tempfilepath  §TMP    =§ drop     // Annak a könyvtárnak a
PATH-ja, ahova az elkészült ideiglenes fájl kerül, az,
//                                               amit a $EDITOR
változóban meghatározott texteditorral szerkesztünk majd.
 6 mem >>> @tempfilebasename §TEMPFILENAME =§ drop  // Az ideiglenes
file alapneve a pidstring nélkül
 6 mem >>> @kiterjesztés     §KITER        =§ drop  // Az ideiglenes
file kiterjesztése
10 mem sto! @pidstring
10 mem >>> @aktdirname #g argc 3 >= !{ §defaultdir =§ goto §folyt } 2 argv
folyt:
#g 'd istrue !{ "The given directory doesn't exists!\n" goto §invmems }
dir >>> @aktdir @aktdirname loaddir dup {_ "Error! Errorcode = " #g
printnl! drop goto §invmemsdir } drop
drop // (töröltük az @ktdir -et a stackból)
3 mem >>> @drl §DRL =§ drop // Ezekkel a típusú
tartalomjegyzék-bejegyzésekkel foglalkozunk a programban. És ebben a
sorrendben
// fognak megjelenni a szerkesztendő ideiglenes fájlban felülről lefelé:
// D azaz Directoryk,
// R azaz Reguláris (közönséges) fájlok
// L azaz Linkek.
1 mem >>> @spcstring §spacestring =§ drop // string munkaváltozó
@pidstring 6 '- pidstr drop // A pidstring előállítása
30 mem >>> @nameofthetemporaryfile @tempfilebasename ===! #s §pid +§
@pidstring + @kiterjesztés + drop
50 mem >>> @namewithfullpath @tempfilepath ===! @nameofthetemporaryfile + drop
dir >>> @mappa @aktdirname loaddir #g {_ "Error! Cannot read the dir.
Errorcode = " printnl! drop fail } drop
drop 0 @drl ~ {| @mappa @drl [{}] swad amount + |} // E trükkös ciklus
meghatározza a fájlok összegét
// azon fájltípusokra amik a @drl stringben vannak, azaz a 'D 'R és 'L
típusokra.
!{_ "The given dir is empty!\n" end }
array sto! @output // Stringtömb allokálás. Ebben lesznek az
ideiglenes fájlba kiirandó sorok.
256 array sto! @a256 // Csináltunk egy stringtömböt 256 elemmel (stringgel).
@aktdirname per!
// E ciklusban foglalunk le memóriát a 'D 'R és 'L indexű stringeknek
a stringtömbben.
// Ezen indexű stringjeink annyi karakterből állnak majd,
// ahány tartalomjegyzéki bejegyzés van abból a típusból:
@drl {: @mappa :[] amount mem sto @ideiglenes
@a256 :[] [] inv mem swap :[] swap <> drop @ideiglenes maximize drop
:}
100 mem sto! @sor 20  mem sto! @countstring zero @linecounter

@drl ~ {| // ciklus minden fájltípusra
@mappa @drl [{}] swad amount { // Csak akkor írunk ki ha van
egyáltalán abból a típusból
@mappa restore @drl [{}] swad settype {: // start of the iteratorloop
on the directory
#s @sor §spacestring =§ 0 @drl [{}] swad <> §tab +§
@countstring {:} #g (#s) #s noleftspc + §tab +§
@countstring :filename + #g @output rcl++ @linecounter rot <<>>!
:} // end of the iteratorloop
} |}

// Így irathatnánk ki a konzolra ellenőrzésképpen: #s @sor @output {:
:[] printnl :}

#s @output @namewithfullpath <<write>>!
dup { "Error while opening the output file! Errorcode = " #g printnl!
fail }  drop drop
@defaulteditor §spacestring +§ @namewithfullpath + shell! // A
parancsstring előállítása és végrehajtatása a shellel
10 mem sto! @fields
10 mem >>> @input @namewithfullpath loadtext // Ezzel az egyetlen
sorral beolvastuk a teljes fájlt a @input stringtömbbe,
// és szétdaraboltuk sorokra.
@namewithfullpath removefile! // töröltük az ideiglenes fájlt
{: // Iterátor a @input stringtömb minden sorára
@fields @sor :[] 9 fields
// Tesztelésre ha ki akarjuk iratni a sor összes mezőjét: {: @sor :[]
#g {:} 2 == { #s -- } #s print "***" drop :} nl
1 [] sto! @aktmező @aktmező usag sto! @sorszám
2 [] sto! @aktneve @aktneve -- // Levágtuk a filenév végéről a
felesleges újsor-karaktert
drop 0 [] sto! @aktmező @aktmező first sto @típusjelölő
§DRL switch
// ...................................................................
"Ismeretlen bejegyzéstípus az ideiglenes fájlban!\n"
"Esetleg kitörölted vagy megváltoztattad a sor első karakterét?\n"
"Állománynév: " @aktneve #s printnl!
"A hibás típusazonosító karakterkódja: " #g rcl @típusjelölő printnl
"Maga a karakter: " #k printnl!
fail
// ...................................................................
d: r: l:
@a256 rcl @típusjelölő [] >>> @ideiglenes rcl @sorszám 1 <>! drop //
Ebben a sorban azt vizsgáljuk,
// milyen típusú fájlról szól a beolvasott sor.
// Amilyen típusú, az ahhoz tartozó tömbelem megfelelő sorszámú elemét
1-re állítjuk. Ez amiatt
// fontos, mert így tudjuk követni, nincs-e kitörölve az editált
fájlból az adott sorszámú fájl sora.
// Ha ugyanis azt kitörölte a Felhasználó, majd törölni kell azt a
fájlt vagy könyvtárat is!
:}
// Most ki kell törölnünk a listában már nem szereplő fájlokat:
@drl ~ {| @a256 @drl [{}] swad [] >>> @ideiglenes {: :[] !{
@sor @aktdir @drl [{}] swad {:} filename @aktdirname 0 before
@drl [{}] swad #g 'D == { #s
removedir!
}{ #s
removefile! // A fájl törlése
} } :} drop |}
// Most jön az átnevezgetés:
100 mem sto! @oldname 100 mem sto! @newname
@fields @input restore {: // Iterátor a @input stringtömb minden sorára
@sor :[] 9 fields
1 [] >>> @aktmező usag sto! @sorszám
0 [] >>> @aktmező first sto! @típusjelölő
2 [] >>> @aktname -- // Felesleges újsor karakter törlése
@oldname @aktdir rcl @típusjelölő rcl @sorszám filename
#s != { @oldname @aktdirname 0 before @newname @aktname ===!
@aktdirname 0 before
rename
} :} drop
// ===================================================================
im @oldname im @newname im @input     im @sor   im @countstring
im @fields  im @a256    im @output    im @mappa im @nameofthetemporaryfile
im @namewithfullpath    im @spcstring im @drl
invmemsdir:
im @aktdir
invmems:
invmems @defaulteditor @aktdirname
end
EDITOR:     "EDITOR"
defaultdir: "."
TMP:        "/tmp/"
TEMPFILENAME: "VIDIRUPU_temporary_file" // Az ideiglenes file alapneve
a pidstring nélkül
KITER:        ".tmp" // Az ideiglenes file kiterjesztése
DRL: "DRL" §d §r §l
spacestring: " "
pid: "_PID"
tab: "\t"

Jól megaszondván nektek a Zőszinteséget, az lehet hogy a nyelvemen programozni nem könnyű és kihívás (ez végülis egyéni ízlés kérdése, gondolok itt arra kinek mi áll „kézre”, miféle stílust tud megtanulni könnyebben), de az is biztos hogy bárki elfogulatlan szemlélődő ha megcsekkolja, azt kell mondja róla hogy baromi jól néz ki! Komolyan, titokzatosan, misztikusan, és... és épp emiatt VONZÓN! Tehát: SZÉP! (Oké, most lehet hogy megvan a nem éppen hízelgő véleményed a szépérzékemről, de annyi baj legyen...
Nekem tetszik, s merem vállalni hogy ilyen az ízlésem! A „szellemi
étkeket” illetően...)

Programming is like using toilets; you can't say you are done until paperwork's finished!
Nyilvános megtekintési jogosultság letiltva.

Programnyelvem lényegében készen van! 2019 febr. 14 19:02 #2340

  • FossilCodger
  • FossilCodger profilkép
  • Nem elérhető
  • Arany fokozatú fórumozó
  • Hozzászólások: 209
  • Köszönetek: 6
  • Karma: 0
Reszkessetek!!! Reszkessen mindenki! Reszkessen az egész világ, Huuuúúú!
Ugyanis kapaszkodjatok meg de nagyon ám: A programnyelvem nemcsak készen van (jó, persze, ismétlem, lehet fejleszteni bőségesen, fogom is mert a határ mindig csak a csillagos ég...) de, és most jön a lényeg: KÖZEL A PILLANAT, amikor KÖZZÉ IS TESZEM!
Úgy bizony!

De nem akárhogy. Hanem, természetesen ANGOL NYELVEN. Ezalatt az értendő, hogy addig nem lesz letölthető, amíg készen nem lesz hozzá az angol dokumentáció. Nem, magyarul nem fogom közreadni a doksit... Teljesen felesleges. Csak a hülye kritika jönne tonnaszám hogy a stílusom „nem elég szakmai” meg hasonlók. Tudom persze akkor is megkapom majd ezt ha angolul lesz elérhető a doksi, de ha így is és úgy is megkapom, akkor minek strapáljam magamat azzal hogy duplán is elérhető legyen?!

Na mindegy, sóval s tetvvel, hehehe, elkezdtem az angolra fordítást (a doksiét), elég jól is haladok vele. Igaz, az angolságom minden csak nem irodalmi, elismerem ezt (sőt... az hogy „nem irodalmi” sajnos kifejezetten „understatement”-nek tekinthető, ez egy rém polkorrekt fogalmazás mert igen erősen a béka segge alatt van a tudásom, így amit produkálok az „rather Tarzan-like”...), de annyi baj legyen, mert tudjátok meg hogy akad ám nekem igazi anyanyelvi „publisher reader”-em... ő megnyugtatott hogy semmi baj, majd kijavítja! Lefordítani nem fogja helyettem, de ha én megteszem olyan minőségben hogy legalább érthető legyen, akkor majd stilizálja. Mert szerinte is tök jó, és nagyon alkalmas a hype felkeltésére, hogy a (sci-fi) sorozatomhoz létezik egy igazi, működőképes programnyelv is! Ahogy ő maga is fogalmazott:

We may say that creating artificial human languages to serve literary purposes are not so exceptional; but a programming language to serve literary purposes is definitely unique.

Emellett, ez olyan programnyelv ami nem CSAK irodalmi célra használható (mint például az Arnold-C aminek alkalmazhatósági köre, ismerjük el igencsak korlátozott...) de valóban használható a nyelvem bármi előforduló feladathoz, legalábbis kisebb szkriptek írását értve ezalatt, illetve, akár nagy munkákhoz is jó, ha nem is most de később amikor majd íródik hozzá mindenféle „bővítmény”, „modulok” meg hasonló nyalánkságok, magyarán „külső könyvtárak”, vagy mindegy hogy nevezzük. Az biztos hogy azóta már megvan nekem a „vidir” program „portolása”, azaz megírtam azt az én Drágaszágomban, az UPU nyelvben, kiválóan „működi magát”, van remek directorylistázó progim is „benne megírva”, megcsináltam a Life nevű „életjáték” programot is (tudjátok, a sejtautomata program... Nemcsak működik de eszméletlenül gyors is, annyira hogy muszáj voltam komoly lassítást beleprogramozni különben élvezhetetlenül gyors lenne...), megírtam UPU nyelven egy statusbarkezelő programot a kedvenc DWM ablakkezelőmhöz, stb.

Tehát, ez egy HASZNÁLHATÓ programnyelv, bár magam is őszintén elismerem, nem olyan „kezdőbarát”, mint az elterjedtebb szkriptnyelvek. Elismerem. Ellenben cserébe hihetetlenül gyors... Legalábbis ha odafigyelünk a kódolásra. (Nem létezik olyan programnyelv amiben ne lehetne szuboptimális kódot írni...)

Még ha ennek ellenére is úgy véli valaki, a szintaxisa túl „nehézkes” ahhoz hogy másnak is neveztethessék mint „ezoterikus” nyelvnek, akkor is tagadhatatlan hogy legalábbis azok közt kiérdemli azt a kitüntető címet, hogy:
„az ezoterikus programnyelvek Istencsászára”.

Mielőtt valaki belekötne: Turing-teljes! És e tény be is van róla bizonyítva. A részletek erről megtalálhatóak (majd...) a dokumentációban.

Tehát reszkessetek, mert közeleg már az Ítélet Napja, amikoris megjelenik majd a Nagy, a Hatalmas UPU, s egyáltalán nem lehetetlen hogy erre rá pár évre akár még valamiféle népszerűséget is elér majd, s tanulhatjátok majd meg, mert lesz igény az ebben írt programokra...

Estimated publishing time: approx. 1 év múlva. Igaz, a fordítás nagyjából harmadával már végeztem, de még hátra van a többi, ami jelentős kihívás a számomra, továbbá a lektoromnak is kell idő hogy átnézze, emellett pedig most még más dolga is van mert egy másik könyvemen dolgozik épp, nem mellékesen a legjobb (és legnagyobb...) regényemen... addig semmiképp se fárasztom őt le az UPU-val amíg azt be nem fejezi. De, ahogy mondani szokás, az UPU „coming soon”, because „it is in progress”...

Tehát jó lesz előre beszerezni kilószámra a nyugtatókat, idegcsillapítókat, neuroleptikumokat és hasonlókat, mert közeleg már a nap...!

Programming is like using toilets; you can't say you are done until paperwork's finished!
Nyilvános megtekintési jogosultság letiltva.
Oldalmegjelenítési idő: 0.088 másodperc