Hozzászólások
-
SzerzőBejegyzés
-
vizsla wrote:Mondjuk, ami nekem hiányzik, az egy gobject c kód generátor. Noha van pl. a gob, de az elég rugalmatlan.
Maga az preprocesszor nem enged meg bizonyos dolgokat, amelyeket ugyan a c kódba be lehet tenni, de ha felülírja az ember a kinduló kódot, és „frissíti” c kódot eltűnnek a változások.„GObject Builder (GOB) is a simple preprocessor for easily creating GObjects (glib objects).”
Ez mindent elmond a korlátokról. Arra épít, hogy aki nem profi, azt megkímélje a sok gépeléstől. Ha az exit_on_error változó értékét kivezeted a paraméterezéshez (mint a –no-exit-on-warn kapcsoló esetén), akkor ugyan továbbra is sírni fog, de legalább a kódot ki fogja írni.
„Pedig valami ilyesmiről van szó… az más kérdés, hogy milyen finomságokra gondolt.”
Mindkét ötlet jó, és kielégíti a nagyon rövid feladatmegadást. Szándékosan nem akartam korlátokat állítani. Az első ötlet is metaprogram, de így is meg lehet valósítani:
Code:#!/bin/shKOD=””
`$KOD`
Ez esetben a metaprogram a változó és a külső programfutást lehetővé tevő operátor („), a metaprogram példányosítása a változó tartalma, a generált kód meg a változó értékének behelyettesítése.
Vizsla megoldása még jobb, bár az nem bash metaprogram, hanem inkább meta-bash program (bash nyelven írt bash metaprogram), és az implementációs szintet viszi „meta fellegekbe”.
Azért jutott az eszembe ez a feladat, mert három független logikai részre lehet leboltani az általam megvalósított progit:
– halmaz operátorok (metszet, únió, különbség)
– normál és numerikus rendezés
– forrásfájl kódolása (karakterlánc vagy új sorral elválasztott felsorolás).De egy valami hasolnó mindegyikben, hogy a megvalósító funkciók, a segítség szövege és a paraméterek feldolgozása logikailag összefüggőek. Azaz ha megadok egy binér halmaz operátor definíciót így (a három pont (…) a kihagyás jele):
Code:név „leírás” {kód}pl:
kivon „Két halmaz különbsége” {$RENDEZ $1 $TMP1; $RENDEZ $2 $TMP2; diff (…)>$TMP3; $RENDEZ $TMP3 $3;}akkor meglehetősen könnyen lehet új operátorokkal bővíteni a programot, és az mindig érvényes és jól definált lesz a progi (az összes összefüggő rész egyszerre módosul, csökken a programozási hiba lehetősége).
A következő három sablonnal:
Code:function {}
function segitseg {
(…)
echo ” — ”
(…)
}for i in $*
(…)
–) MUVELET=
if test „$BEVITEL” != 2
then
segitseg
fi ;;
(…)viszonylag könnyen lehet előállítani pl. ezeket a kódrészeket:
Code:function kivon {
$RENDEZ $1 $TMP1
$RENDEZ $2 $TMP2
diff (…)>$3;
$RENDEZ $TMP3 $3;
}function segitseg {
(…)
echo ” –kivon Két halmaz különbsége”
(…)
}for i in $*
(…)
–kivon) MUVELET=kivon
if test „$BEVITEL” != 2
then
segitseg
fi ;;
(…)Ugyanígy a rendezést is és a fájlok kódolását (formátumát) is végig lehetne zongorázni. Ez a megközelítés a feladatleírás oldaláról történik, és szintén metaprogram. Egy kicsit (vagy nagyon, izlés dolga) loptam a webes technikák közül. Kissé hosszú lett, remélem érthető a lényeg.
„Pedig valami ilyesmiről van szó… az más kérdés, hogy milyen finomságokra gondolt.”
Mindkét ötlet jó, és kielégíti a nagyon rövid feladatmegadást. Szándékosan nem akartam korlátokat állítani. Az első ötlet is metaprogram, de így is meg lehet valósítani:
Code:#!/bin/shKOD=””
`$KOD`
Ez esetben a metaprogram a változó és a külső programfutást lehetővé tevő operátor („), a metaprogram példányosítása a változó tartalma, a generált kód meg a változó értékének behelyettesítése.
Vizsla megoldása még jobb, bár az nem bash metaprogram, hanem inkább meta-bash program (bash nyelven írt bash metaprogram), és az implementációs szintet viszi „meta fellegekbe”.
Azért jutott az eszembe ez a feladat, mert három független logikai részre lehet leboltani az általam megvalósított progit:
– halmaz operátorok (metszet, únió, különbség)
– normál és numerikus rendezés
– forrásfájl kódolása (karakterlánc vagy új sorral elválasztott felsorolás).De egy valami hasolnó mindegyikben, hogy a megvalósító funkciók, a segítség szövege és a paraméterek feldolgozása logikailag összefüggőek. Azaz ha megadok egy binér halmaz operátor definíciót így (a három pont (…) a kihagyás jele):
Code:név „leírás” {kód}pl:
kivon „Két halmaz különbsége” {$RENDEZ $1 $TMP1; $RENDEZ $2 $TMP2; diff (…)>$TMP3; $RENDEZ $TMP3 $3;}akkor meglehetősen könnyen lehet új operátorokkal bővíteni a programot, és az mindig érvényes és jól definált lesz a progi (az összes összefüggő rész egyszerre módosul, csökken a programozási hiba lehetősége).
A következő három sablonnal:
Code:function {}
function segitseg {
(…)
echo ” — ”
(…)
}for i in $*
(…)
–) MUVELET=
if test „$BEVITEL” != 2
then
segitseg
fi ;;
(…)viszonylag könnyen lehet előállítani pl. ezeket a kódrészeket:
Code:function kivon {
$RENDEZ $1 $TMP1
$RENDEZ $2 $TMP2
diff (…)>$3;
$RENDEZ $TMP3 $3;
}function segitseg {
(…)
echo ” –kivon Két halmaz különbsége”
(…)
}for i in $*
(…)
–kivon) MUVELET=kivon
if test „$BEVITEL” != 2
then
segitseg
fi ;;
(…)Ugyanígy a rendezést is és a fájlok kódolását (formátumát) is végig lehetne zongorázni. Ez a megközelítés a feladatleírás oldaláról történik, és szintén metaprogram. Egy kicsit (vagy nagyon, izlés dolga) loptam a webes technikák közül. Kissé hosszú lett, remélem érthető a lényeg.
vizsla wrote:Na, most ez a megoldás, – ha jól látom – már a két feladatnak a kombinációja…Igen, bár a verziószám feladatot még lehet cifrázni, hogy csomagneveket is lehessen rendezni, ami már felmerült (ize-bize-1.1.3-6.fc6). De van egy horror feladatom, csak nem volt elég bátorságom bedobni.
Tehát Ti, Kedves lovagok, akik éppen megfelelő méltó küzdelem híjján vagytok, íme egy újabb megmérettető feladat:
Feladat: a két korábbi – ha nem is lényegesen különböző – feladat valamelyikére bash metaprogram készítése (programot író program).
vizsla wrote:Na, most ez a megoldás, – ha jól látom – már a két feladatnak a kombinációja…Igen, bár a verziószám feladatot még lehet cifrázni, hogy csomagneveket is lehessen rendezni, ami már felmerült (ize-bize-1.1.3-6.fc6). De van egy horror feladatom, csak nem volt elég bátorságom bedobni.
Tehát Ti, Kedves lovagok, akik éppen megfelelő méltó küzdelem híjján vagytok, íme egy újabb megmérettető feladat:
Feladat: a két korábbi – ha nem is lényegesen különböző – feladat valamelyikére bash metaprogram készítése (programot író program).
Elég sokat használom a diff-et, így „kéznél volt”. Egy picit keveselltem is a megoldás méretét, ezért körítettem hozzá egy kicsit. Most már illik jobban odafigyelni a minőségre is, ahol a modularitás, a hibák lekezelése, bővíthetőség és a helyes működés könnyű ellenőrzése a főbb szempontok.
Elég sokat használom a diff-et, így „kéznél volt”. Egy picit keveselltem is a megoldás méretét, ezért körítettem hozzá egy kicsit. Most már illik jobban odafigyelni a minőségre is, ahol a modularitás, a hibák lekezelése, bővíthetőség és a helyes működés könnyű ellenőrzése a főbb szempontok.
Hát, el kell hogy szomorítsalak, de már van karakterkód kiírató progi. Úgy a ’70-es évektől..
Két választási lehetőséged van, vagy a terminálon keresztül kéred be a lenyomott gombokat, vagy az X11-et kéred meg, hogy árulja el őket. Ez utóbbihoz az „xmodmap -pke” parancs segítségével juthatsz el a kívánt kódokhoz.
Javasolt keresési kulcsszavak:
Terminál: „key code terminal vt-100”
X11: „key code site:x.org”Hát, el kell hogy szomorítsalak, de már van karakterkód kiírató progi. Úgy a ’70-es évektől..
Két választási lehetőséged van, vagy a terminálon keresztül kéred be a lenyomott gombokat, vagy az X11-et kéred meg, hogy árulja el őket. Ez utóbbihoz az „xmodmap -pke” parancs segítségével juthatsz el a kívánt kódokhoz.
Javasolt keresési kulcsszavak:
Terminál: „key code terminal vt-100”
X11: „key code site:x.org”Volt szabad 5 percem, úgyhoy összedobtam egy kis bash scriptet. ;D Lassan már 3 hete dobta fel a témát Vizsla, de mindenki csak kóstolgatja a bash változatot, most itt egy komplex implementáció:
halmaz.sh
Code:#!/bin/shTMP1=”temp.1.txt”
TMP2=”temp.2.txt”
BEVITEL=1
KEZDO=1
ELVALASZTO=”.”function rendezes {
if ! [ -f $1 ]
then
echo „A(z) $1 fájl nem létezik!”
exit 2
fi
cat $1 | sort -u >$2
}function rendezes_karakterlanc {
if ! [ -f $1 ]
then
echo „A(z) $1 fájl nem létezik!”
exit 2
fi
cat $1 |
sed -e ‘s/”([^”]*)”[ t]*/1n/g’ |
grep ‘[^n]’ |
sort -u >$2
}function numerikus_rendezes {
O1=$KEZDO
O2=`expr $O1 + 1`
O3=`expr $O1 + 2`
if ! [ -f $1 ]
then
echo „A(z) $1 fájl nem létezik!”
exit 2
fi
cat $1 | sort -u -t $ELVALASZTO -k ${O1},${O1}n -k ${O2},${O2}n -k ${O3},${O3}n >$2
}function numerikus_rendezes_karakterlanc {
O1=$KEZDO
O2=`expr $O1 + 1`
O3=`expr $O1 + 2`
if ! [ -f $1 ]
then
echo „A(z) $1 fájl nem létezik!”
exit 2
fi
cat $1 |
sed -e ‘s/”([^”]*)”[ t]*/1n/g’ | grep ‘[^n]’ |
sort -u -t ‘$ELVALASZTO’ -k ${O1},${O1}n -k ${O2},${O2}n -k ${O3},${O3}n >$2
}function kivon {
$RENDEZES $1 $TMP1
$RENDEZES $2 $TMP2
diff -u $TMP1 $TMP2 |
grep -v „^—” |
grep „^-„|
cut -b 2- |
sort -u >$3
rm -f $TMP1 $TMP2
}function unio {
if test „$LANC” = „”
then
cat $1 $2 >$TMP1
else
cat $1 $2 | tr ‘n’ ‘ ‘>$TMP1
fi
$RENDEZES $TMP1 $3
rm -f $TMP1
}function metszet {
$RENDEZES $1 $TMP1
$RENDEZES $2 $TMP2
diff -u $TMP1 $TMP2 |
grep „^ ” |
cut -b 2- |
sort -u >$3
rm -f $TMP1 $TMP2
}function segitseg {
echo „Használat: $0 [opciók] — ”
echo „”
echo ” Műveletek:”
echo ” –kivon”
echo ” –unio”
echo ” –metszet”
echo „”
echo ” Opciók:”
echo ” -l Karakterlánc bemenet”
echo ” -n Numerikus bemenet”
echo ” -t Elválasztó (csak numerikus bemenetnél)”
echo ” -k Kezdő oszlop (csak numerikus bemenetnél)”
echo ” -v Bőbeszédű kimenet”
echo „”
echo ” Példa: $0 A–kivon B C”
echo „”
exit 1
}if test $# -le 4
then
segitseg
fifor i in $*
do
if test „$PARANCS” = „elvalaszto”
then
ELVALASZTO=”$i”
elif test „$PARANCS” = „kezdo”
then
KEZDO=”$i”
else
case $i in
-l) LANC=_karakterlanc ;;
-n) NRENDEZ=numerikus_ ;;
-t) if test „$NRENDEZ” = „”
then
echo „Csak numerikus bemenetet lehet elválasztani!”
exit 3
else
PARANCS=elvalaszto
fi ;;
-k) if test „$NRENDEZ” = „”
then
echo „Csak numerikus bemenetnél lehet kezdő kulcsot megadni!”
exit 3
else
PARANCS=kezdo
fi ;;
–kivon) MUVELET=kivon
if test „$BEVITEL” != 2
then
segitseg
fi ;;
–unio) MUVELET=unio
if test „$BEVITEL” != 2
then
segitseg
fi ;;
–metszet) MUVELET=metszet
if test „$BEVITEL” != 2
then
segitseg
fi ;;
-v) NYOMTAT=1 ;;
-h) segitseg ;;
–help) segitseg ;;
-?) segitseg ;;
*) if test „$PARANCS” != „”
then
segitseg
else
case $BEVITEL in
1) FORRAS1=$i
BEVITEL=2 ;;
2) FORRAS2=$i
BEVITEL=3 ;;
3) KIMENET=$i
BEVITEL=4 ;;
*) segitseg ;;
esac
fi;;
esacfi
doneRENDEZES=${NRENDEZ}rendezes${LANC}
$MUVELET $FORRAS1 $FORRAS2 $KIMENETif test „$LANC” != „”
then
mv $KIMENET $TMP1
cat $TMP1 |
sed -e ‘s/([^n]*)/”1″/g’ |
tr ‘n’ ‘ ‘ >$KIMENET
echo „” >>$KIMENET
rm -f $TMP1
fiif test „$NYOMTAT” = „1”
then
echo „”
echo „Művelet: $MUVELET”
echo „”
echo „Forrás 1 (A):”
echo „————-”
cat $FORRAS1
echo „”
echo „Forrás 2 (B):”
echo „————-”
cat $FORRAS2
echo „”
echo „Eredmény (C):”
echo „————-”
cat $KIMENET
echo „”
fiNincs különösebben tesztelve, tényleg csak gyorsan összedobtam. Viszont szándékosan kihagytam a leírást (megjegyzéseket), hogy pontosan mi mit csinál. Akit érdekel, jó kis móka kibogozni.
Az általam tesztelt eredmények:
Code:$ ./halmaz.sh -v A1 –metszet B1 CMűvelet: metszet
Forrás 1 (A):
————-
1.1.3.fc6
1.1.5.fc6
1.2.3.fc6
2.1.4.fc6
1.10.5.fc6Forrás 2 (B):
————-
1.1.3.fc6
1.1.5.fc6
1.2.3.fc6
2.1.7.fc6Eredmény (C):
————-
1.1.3.fc6
1.1.5.fc6
1.2.3.fc6és
Code:$ ./halmaz.sh -l -v A –metszet B CMűvelet: metszet
Forrás 1 (A):
————-
„1.1.3.fc6” „1.1.5.fc6” „1.2.3.fc6” „2.1.4.fc6” „1.10.5.fc6”Forrás 2 (B):
————-
„1.1.3.fc6” „1.1.5.fc6” „1.2.3.fc6” „2.1.7.fc6”Eredmény (C):
————-
„1.1.3.fc6” „1.1.5.fc6” „1.2.3.fc6” -
SzerzőBejegyzés