ນີ້ແມ່ນຄໍາສັ່ງ prima-gencls ທີ່ສາມາດດໍາເນີນການໄດ້ໃນ OnWorks ຜູ້ໃຫ້ບໍລິການໂຮດຕິ້ງຟຣີໂດຍໃຊ້ຫນຶ່ງໃນຫຼາຍບ່ອນເຮັດວຽກອອນໄລນ໌ຂອງພວກເຮົາເຊັ່ນ Ubuntu Online, Fedora Online, Windows online emulator ຫຼື MAC OS online emulator
ໂຄງການ:
NAME
gencls - class interface compiler ສໍາລັບໂມດູນຫຼັກ Prima
ສະຫຼຸບສັງລວມ
gencls --h --inc --tml -O -I --depend --sayparent filename.cls
ລາຍລະອຽດ
ສ້າງສ່ວນຫົວດ້ວຍ C macro ແລະໂຄງສ້າງສໍາລັບການກໍານົດວັດຖຸໂມດູນຫຼັກ Prima.
ການໂຕ້ຖຽງ
gencls ຍອມຮັບການໂຕ້ຖຽງຕໍ່ໄປນີ້:
--h ສ້າງໄຟລ໌ .h (ມີຄໍາປະກາດທີ່ຈະລວມຢູ່ໃນຫນຶ່ງຫຼືຫຼາຍໄຟລ໌)
--inc
ສ້າງໄຟລ໌ .inc (ດ້ວຍການປະກາດທີ່ຈະລວມຢູ່ໃນໄຟລ໌ເທົ່ານັ້ນ)
-O ເປີດການປັບແຕ່ງສູດການຄິດໄລ່ສໍາລັບໄຟລ໌ .inc. ສູດການຄິດໄລ່ແມ່ນອີງໃສ່ສົມມຸດຕິຖານ,
ວ່າບາງຫນ້າທີ່ຖືກປະກາດຄືກັນ, ດັ່ງນັ້ນຊິ້ນສ່ວນລະຫັດທີ່ຈັດການກັບ
ພາລາມິເຕີແລະການແປງຜົນໄດ້ຮັບສາມາດແບ່ງປັນໄດ້. ດ້ວຍທຸງ "-O" ຢູ່ເທິງ, ຮ່າງຂອບແມ່ນ
ແທນທີ່ການໂທຫາຟັງຊັນ, ຊື່ທີ່ສ້າງຂຶ້ນຈາກຕົວກໍານົດວິທີການທັງຫມົດ
ຜົນບວກ. ຟັງຊັນຕົວຈິງບໍ່ໄດ້ຂຽນໄວ້ໃນໄຟລ໌ .inc, ແຕ່ຢູ່ໃນໄຟລ໌ .tml. ທັງໝົດ
ການປະກາດຊໍ້າກັນຈາກຊຸດຂອງໄຟລ໌ .tml ສາມາດເອົາອອກໄດ້ ແລະການແຈ້ງເຕືອນ
ຂຽນໃສ່ໄຟລ໌ຫນຶ່ງໂດຍ tmlink utility.
--tml
ສ້າງໄຟລ໌ .tml. ເປີດ "-O" ອັດຕະໂນມັດ.
- ຊື່
ເພີ່ມໄດເລກະທໍລີໃສ່ເສັ້ນທາງຄົ້ນຫາ, ບ່ອນທີ່ຜົນປະໂຫຍດຄົ້ນຫາໄຟລ໌ .cls. ສາມາດເປັນ
ລະບຸຫຼາຍຄັ້ງ.
-- ຂຶ້ນກັບ
ພິມອອກຄວາມເພິ່ງພາອາໄສຂອງໄຟລ໌ທີ່ໃຫ້.
--sayparent
ພິມພໍ່ແມ່ຂອງຊັ້ນຮຽນພາຍໃນໄຟລ໌ທີ່ໃຫ້ໄວ້.
SYNTAX
ໃນສັ້ນ, syntax ຂອງໄຟລ໌ .cls ສາມາດຖືກອະທິບາຍໂດຍໂຄງການຕໍ່ໄປນີ້:
[ການປະກາດປະເພດສູນ ຫຼືຫຼາຍກວ່ານັ້ນ]
[ການປະກາດສູນ ຫຼືໜຶ່ງຊັ້ນ]
Gencls ຜະລິດໄຟລ໌ .h, .inc ຫຼື .tml, ດ້ວຍຊື່ພື້ນຖານຂອງໄຟລ໌ .cls, ຖ້າບໍ່ມີວັດຖຸ ຫຼື
ຊື່ແພັກເກັດທີ່ໃຫ້, ຫຼືດ້ວຍຊື່ຂອງວັດຖຸ ຫຼືແພັກເກດນັ້ນ.
ພື້ນຖານ ຜິວ ໜັງ ຂໍ້ມູນ ປະເພດ
Gencls ມີຫຼາຍປະເພດຂໍ້ມູນ scalar ທີ່ສ້າງຂຶ້ນໃນ, ທີ່ມັນຮູ້ວິທີການຈັດການກັບ. ເພື່ອ 'ຈັດການກັບ'
ຫມາຍຄວາມວ່າມັນສາມາດສ້າງລະຫັດທີ່ໂອນຂໍ້ມູນຂອງປະເພດເຫຼົ່ານີ້ລະຫວ່າງ C ແລະ perl,
ການນໍາໃຊ້ XS (ເບິ່ງ perlguts ) ການໂຕ້ຕອບຫ້ອງສະຫມຸດ.
ປະເພດແມ່ນ:
int
ບູລ
ຈັດການ
double
SV*
HV*
char *
string ( C declaration is char[256] )
ຍັງມີບາງປະເພດທີ່ມາຈາກການກໍ່ສ້າງ, ເຊິ່ງແມ່ນ
ຍາວ
ສັ້ນ
char
ສີ
U8
ທີ່ຖືກແຜນທີ່ກັບ int. ຂໍ້ມູນບໍ່ໄດ້ຮັບການປ່ຽນເປັນ int ໃນຂະບວນການໂອນ, ແຕ່ມັນ
ຖືກເກັບໄວ້ແທນ perl scalar ໂດຍໃຊ້ newSViv() ຟັງຊັນ, ເຊິ່ງ, ໃນທາງກັບກັນ, ອາດຈະສູນເສຍ bits
ຫຼືເຄື່ອງຫມາຍ.
ມາຈາກ ຂໍ້ມູນ ປະເພດ
syntax ສໍາລັບຄໍານິຍາມປະເພດຂໍ້ມູນໃຫມ່ມີດັ່ງນີ້:
ຂອບເຂດສາມາດເປັນຫນຶ່ງໃນສອງ pragmas, "ທົ່ວໂລກ" ຫຼື "ທ້ອງຖິ່ນ". ພວກເຂົາເຈົ້າຊີ້ໃຫ້ເຫັນເຖິງການນໍາໃຊ້ຂໍ້ມູນໃຫມ່
ປະເພດ, ບໍ່ວ່າຈະເປັນປະເພດຈະຖືກນໍາໃຊ້ພຽງແຕ່ສໍາລັບຫນຶ່ງຫຼືຫຼາຍວັດຖຸ. ການນໍາໃຊ້ "ທ້ອງຖິ່ນ" ແມ່ນ
ຂ້ອນຂ້າງຄ້າຍຄືກັບ C pragma static. ໃນປັດຈຸບັນຄວາມແຕກຕ່າງພຽງແຕ່ແມ່ນຫນ້າທີ່
ການນໍາໃຊ້ປະເພດທ້ອງຖິ່ນທີ່ສັບສົນໃນບັນຊີລາຍຊື່ພາລາມິເຕີຫຼືຜົນໄດ້ຮັບບໍ່ແມ່ນຫົວຂໍ້ສໍາລັບ
ການເພີ່ມປະສິດທິພາບ "-O".
ສະເກລາ ປະເພດ
ປະເພດ scalar ໃໝ່ ອາດຈະພຽງແຕ່ເປັນນາມແຝງກັບອັນທີ່ມີຢູ່ແລ້ວເທົ່ານັ້ນ, ຕົ້ນຕໍແມ່ນສໍາລັບການເຂົ້າລະຫັດ C
ຄວາມສະດວກສະບາຍ. ປະເພດຂອງ scalar ສາມາດຖືກກໍານົດໃນສອງວິທີ:
ນາມແຝງໂດຍກົງ
Syntax:
$id => ;
ຕົວຢ່າງ:
ທົ່ວໂລກ $Handle => int;
ID ປະເພດໃໝ່ຈະບໍ່ປາກົດຢູ່ໃນໄຟລ໌ C, ແຕ່ປະເພດຈະຖືກປ່ຽນແທນ
ໄຟລ໌ .cls ທັງໝົດທີ່ປະກອບມີຄໍານິຍາມນີ້.
C ມະຫາພາກ
Syntax:
id1 id2
ຕົວຢ່າງ:
API_HANDLE UV
ລະຫັດດັ່ງກ່າວສ້າງຄໍານິຍາມ C macro ໃນໄຟລ໌ header .h ໃນຮູບແບບ
#ກຳນົດ id1 id2
C macro ທີ່ມີພາລາມິເຕີແມ່ນບໍ່ອະນຸຍາດໃຫ້. id1 ແລະ id2 ບໍ່ຈໍາເປັນຕ້ອງມີຢູ່
ໃນຊ່ອງຊື່ .cls, ແລະບໍ່ມີການປ່ຽນແທນໃນລະຫວ່າງການປະມວນຜົນໄຟລ໌ .cls. ນີ້
ການນໍາໃຊ້ pragma ແມ່ນຈໍາກັດຫຼາຍ.
ສະລັບສັບຊ້ອນ ປະເພດ
ປະເພດຂໍ້ມູນທີ່ຊັບຊ້ອນສາມາດເປັນ arrays, structs ແລະ hashes. ພວກເຂົາສາມາດເປັນການປະສົມປະສານຫຼືເປັນ
vector ຂອງ scalar (ແຕ່ບໍ່ຊັບຊ້ອນ) ປະເພດຂໍ້ມູນ.
Gencls ອະນຸຍາດໃຫ້ປະສົມປະສານຫຼາຍປະເພດຂອງຂໍ້ມູນສະລັບສັບຊ້ອນທີ່ພາສາ C ບໍ່ໄດ້
ຮັບຮູ້. ສິ່ງເຫຼົ່ານີ້ຈະຖືກອະທິບາຍຂ້າງລຸ່ມນີ້.
ປະເພດຂໍ້ມູນທີ່ຊັບຊ້ອນບໍ່ໄດ້ຮັບການນໍາເຂົ້າເຂົ້າໄປໃນລະຫັດ perl. ໂປລແກລມ perl ຕ້ອງປະຕິບັດຕາມ
ປະເພດຂໍ້ມູນທີ່ໃຊ້ໃນເວລາຖ່າຍທອດພາລາມິເຕີໄປຫາຟັງຊັນ.
ອາເລ
Syntax:
@id [ຂະຫນາດ];
ຕົວຢ່າງ:
ທົ່ວໂລກ @FillPattern U8[8];
ຕົວຢ່າງຂອງຟັງຊັນທີ່ໃຊ້ arrays:
Array * func( Array a1, Array * a2);
ລະຫັດ Perl:
@ret = func(@array1, @array2);
ໃຫ້ສັງເກດວ່າການອ້າງອິງ array ບໍ່ໄດ້ຖືກນໍາໃຊ້, ແລະຈໍານວນຂອງລາຍການໃນ array ທັງຫມົດ
ພາລາມິເຕີຈະຕ້ອງກົງກັບຂະຫນາດຂອງອາເຣ.
ຫມາຍເຫດ: ການປະກາດຕໍ່ໄປນີ້ຈະບໍ່ລວບລວມກັບ C compiler, ເພາະວ່າ C ບໍ່ສາມາດກັບຄືນ
arrays. ຢ່າງໃດກໍຕາມ, ມັນບໍ່ໄດ້ຖືກປະຕິບັດເປັນຄວາມຜິດພາດໂດຍ gencls:
array func();
ໂຄງສ້າງ
Syntax:
@id {
;
...
;
};
ຕົວຢ່າງ:
ທົ່ວໂລກ @Struc {
int ຈໍານວນ;
string id;
}
ຕົວຢ່າງຂອງຟັງຊັນທີ່ໃຊ້ໂຄງສ້າງ:
Struc * func1( Struc a1, Struc * a2);
Struc func2( Struc a1, Struc * a2);
ລະຫັດ Perl:
@ret = func1( @struc1, @struc2);
@ret = func2( @struc1, @struc2);
ໃຫ້ສັງເກດວ່າການອ້າງອິງ array ບໍ່ໄດ້ຖືກນໍາໃຊ້, ແລະທັງຈໍານວນແລະຄໍາສັ່ງຂອງລາຍການທັງຫມົດ
ຕົວກໍານົດການ array ຕ້ອງໄດ້ຮັບການກໍານົດຢ່າງແນ່ນອນວ່າຂະຫນາດແລະຄໍາສັ່ງຂອງໂຄງສ້າງ. ໂຄງສ້າງ
ຊື່ພາກສະຫນາມບໍ່ໄດ້ຖືກນໍາໃຊ້ໃນລະຫັດ perl ເຊັ່ນກັນ.
hashes
Syntax:
%id {
;
...
;
};
ຕົວຢ່າງ:
ທົ່ວໂລກ %Hash {
int ຈໍານວນ;
string id;
}
ຕົວຢ່າງຂອງຟັງຊັນທີ່ໃຊ້ hashes:
Hash * func1(Hash a1, Hash * a2);
Hash func2(Hash a1, Hash * a2);
ລະຫັດ Perl:
%ret = %{func1(\%hash1, \%hash2)};
%ret = %{func2(\%hash1, \%hash2)};
ໃຫ້ສັງເກດວ່າພຽງແຕ່ການອ້າງອິງ hash ຖືກນໍາໃຊ້ແລະສົ່ງຄືນ. ເມື່ອ hash ຜ່ານຈາກ perl
ລະຫັດມັນອາດຈະມີບາງຊ່ອງຂໍ້ມູນ ຫຼືທັງໝົດບໍ່ໄດ້ຕັ້ງ. ໂຄງສ້າງ C ແມ່ນເຕັມໄປແລະສົ່ງໄປຫາ a
ຟັງຊັນ C, ແລະຊ່ອງຂໍ້ມູນທີ່ບໍ່ໄດ້ຕັ້ງຄ່າຖືກມອບໝາຍໃຫ້ກົງກັນ
ຄ່າ C_TYPE_UNDEF, ເຊິ່ງ TYPE ແມ່ນໜຶ່ງໃນ NUMERIC, STRING ແລະ POINTER ຕົວໜັງສື.
ການແປງຄືນບໍ່ໄດ້ນັບຢູ່ໃນຄ່າເຫຼົ່ານີ້ ແລະສົ່ງຄືນທຸກປຸ່ມ hash ດ້ວຍ a
ຄູ່ທີ່ສອດຄ້ອງກັນ.
Namespace ສ່ວນ
Syntax:
{
...
}
ໄຟລ໌ .cls ສາມາດມີສູນ ຫຼືຫນຶ່ງສ່ວນ namespace, ເຕັມໄປດ້ວຍຄໍາອະທິບາຍຟັງຊັນ.
ຟັງຊັນທີ່ອະທິບາຍໄວ້ໃນນີ້ຈະຖືກສົ່ງອອກໄປໃສ່ ID ທີ່ໃຫ້ໃນລະຫວ່າງການລະຫັດເບື້ອງຕົ້ນ. ກ
namespace ສາມາດເປັນ "object" ຫຼື "package".
syntax namespace ຂອງແພັກເກັດອະນຸຍາດໃຫ້ພຽງແຕ່ການປະກາດຫນ້າທີ່ພາຍໃນ "package" ເທົ່ານັ້ນ
block.
ຊຸດ {
...
}
syntax namespace ຂອງວັດຖຸປະກອບມີຕົວແປແລະຄຸນສົມບັດເຊັ່ນດຽວກັນກັບຫນ້າທີ່ (
ເອີ້ນວ່າວິທີການໃນ syntax ຂອງວັດຖຸ). syntax namespace ຂອງວັດຖຸທົ່ວໄປແມ່ນ
ວັດຖຸ [( ID ຫ້ອງຮຽນພໍ່ແມ່)] {
}
ພາຍໃນ namespace ຂອງວັດຖຸ, syntax ມໍລະດົກສາມາດຖືກນໍາໃຊ້:
ວັດຖຸ ( ) { ... }
ຫຼືຄໍາອະທິບາຍວັດຖຸຮາກເປົ່າ (ບໍ່ມີບັນພະບຸລຸດ)
ວັດຖຸ { ... }
ສໍາລັບການປະກາດຊັ້ນວັດຖຸ.
ຫນ້າທີ່
Syntax:
[ ] ( ) [ => ];
ຕົວຢ່າງ:
int package_func1( int a, int b = 1) => c_func_2;
ຈຸດ package_func2( Struc * x, ... );
method void object_func3(HV * profile);
ຄຳນຳໜ້າແມ່ນໃຊ້ກັບຟັງຊັນວັດຖຸ (ວິທີການ) ເທົ່ານັ້ນ. ເພີ່ມເຕີມກ່ຽວກັບຄໍານໍາຫນ້າໃນ Methods
ສ່ວນ.
ຟັງຊັນສາມາດສົ່ງຄືນບໍ່ມີຫຍັງ (void), scalar (int, string, ແລະອື່ນໆ) ຫຼືສະລັບສັບຊ້ອນ (
array, hash) ປະເພດ. ມັນສາມາດຍອມຮັບຕົວກໍານົດການສະເກັດເງິນແລະສະລັບສັບຊ້ອນ, ດ້ວຍປະເພດ
ການປ່ຽນໃຈເຫລື້ອມໃສທີ່ສອດຄ້ອງກັບກົດລະບຽບທີ່ອະທິບາຍຂ້າງເທິງໃນ "ປະເພດຂໍ້ມູນສະເກັດເງິນພື້ນຖານ"
ສ່ວນ.
ຖ້າຟັງຊັນມີພາລາມິເຕີ ແລະ/ຫຼືຜົນຂອງປະເພດທີ່ບໍ່ສາມາດປ່ຽນໄດ້
ອັດຕະໂນມັດລະຫວ່າງ C ແລະ perl, ມັນໄດ້ຮັບການປະກາດແຕ່ບໍ່ໄດ້ເປີດເຜີຍກັບ perl namespace. ໄດ້
ການເຕືອນໄພທີ່ສອດຄ້ອງກັນແມ່ນອອກ. ມັນເປັນໄປບໍ່ໄດ້ທີ່ຈະໃຊ້ syntax gencls ເພື່ອປະກາດ a
ເຮັດວຽກກັບພາລາມິເຕີທີ່ກໍາຫນົດເອງຫຼືຂໍ້ມູນຜົນໄດ້ຮັບ. ສໍາລັບຈຸດປະສົງດັ່ງກ່າວ, C
ການປະກາດລະຫັດພ້ອມກັບການໂທ "newXS" ຕ້ອງເຮັດ.
ຕົວຢ່າງ: ellipsis (...) ບໍ່ສາມາດປ່ຽນໄດ້ໂດຍ gencls, ແນວໃດກໍ່ຕາມມັນເປັນ C
ການກໍ່ສ້າງ.
ຈຸດ package_func2( Struc * x, ... );
syntax ຂອງຟັງຊັນມີການເພີ່ມຄວາມສະດວກຫຼາຍຢ່າງ:
ຄ່າພາຣາມິເຕີເລີ່ມຕົ້ນ
ຕົວຢ່າງ:
void func(int a = 15);
ຟັງຊັນທີ່ປະກາດໃນແບບນັ້ນສາມາດເອີ້ນໄດ້ທັງ 0 ຫຼື 1 ພາລາມິເຕີ. ຖ້າມັນເປັນ
ເອີ້ນວ່າ 0 ພາຣາມິເຕີ, ຄ່າຈຳນວນເຕັມຂອງ 15 ຈະຖືກໃຊ້ໂດຍອັດຕະໂນມັດ. ໄດ້
syntax ອະນຸຍາດໃຫ້ຄ່າເລີ່ມຕົ້ນສໍາລັບປະເພດ int, pointer ແລະ string ແລະ scalar ຂອງພວກມັນ
ນາມແຝງ.
ຕົວກໍານົດການເລີ່ມຕົ້ນສາມາດມີຫຼາຍເທົ່າທີ່ເປັນໄປໄດ້, ແຕ່ພວກເຂົາຕ້ອງຢູ່ໃນທ້າຍຂອງ
ບັນຊີລາຍຊື່ພາລາມິເຕີຟັງຊັນ. ການປະກາດ "func(int a = 1, int b)" ບໍ່ຖືກຕ້ອງ.
ນາມແຝງ
ໃນລະຫັດ C ທີ່ສ້າງຂຶ້ນ, ຟັງຊັນ C ຕ້ອງຖືກເອີ້ນຫຼັງຈາກພາລາມິເຕີແລ້ວ
ວິເຄາະແລ້ວ. Gencls ຄາດວ່າຈະມີຫນ້າທີ່ສອດຄ່ອງຢູ່ໃນລະຫັດ C, ທີ່ມີຊື່ຄົງທີ່
ແລະບັນຊີລາຍຊື່ພາລາມິເຕີ. ຢ່າງໃດກໍຕາມ, ຖ້າຫາກວ່າວຽກງານຂອງຫນ້າທີ່ດັ່ງກ່າວເປັນ wrapper ກັບຄືກັນ
ຟັງຊັນທີ່ຕີພິມພາຍໃຕ້ຊື່ອື່ນ, aliasing ສາມາດ preformed ເພື່ອບັນທຶກທັງລະຫັດແລະ
ຄວາມໄວ.
ຕົວຢ່າງ:
ແພັກເກດຊຸດ {
void func( int x) => ພາຍໃນ;
}
ຟັງຊັນທີ່ປະກາດໃນແບບນັ້ນຈະບໍ່ໂທຫາ Package_func() C function, ແຕ່
ພາຍໃນ() function ແທນ. ການຮ້ອງຂໍພຽງແຕ່ວ່າ ພາຍໃນ() ຫນ້າທີ່ຕ້ອງມີ
ຕົວກໍານົດການດຽວກັນແລະການປະກາດຜົນກັບ a func().
ເສັ້ນ hash
ວິທີທີ່ສະດວກໃນການໂທຫາຟັງຊັນທີ່ມີ hash ເປັນພາລາມິເຕີຈາກ perl ໄດ້ຖືກສ້າງຂື້ນ. ຖ້າ ກ
ຟັງຊັນຖືກປະກາດດ້ວຍພາລາມິເຕີສຸດທ້າຍ ຫຼືພິມ "HV*", ຈາກນັ້ນແປພາລາມິເຕີ
ຈາກ perl ຫາ C ແມ່ນປະຕິບັດຄືກັບວ່າຕົວກໍານົດການທັງຫມົດທີ່ຜ່ານແມ່ນ hash. hash ນີ້ແມ່ນ
ຜ່ານໄປຫາຟັງຊັນ C ແລະເນື້ອຫາຂອງມັນກັບຄືນມາຫຼັງຈາກນັ້ນກັບຄືນໄປບ່ອນ perl ເປັນ hash ອີກເທື່ອຫນຶ່ງ.
ເນື້ອໃນ hash ສາມາດຖືກແກ້ໄຂພາຍໃນຟັງຊັນ C.
ການປະກາດນີ້ຖືກນໍາໃຊ້ຢ່າງຫຼວງຫຼາຍໃນຜູ້ກໍ່ສ້າງ, ເຊິ່ງລະຫັດ perl ແມ່ນປົກກະຕິ
ຍ່ອຍ
{
%ret = shift-> SUPER ຂອງຂ້ອຍ::init(@_);
...
ກັບຄືນ %ret;
}
ແລະລະຫັດ C ແມ່ນປົກກະຕິແລ້ວ
void Obj_init (HV * profile) {
init(ໂປຣໄຟລ໌);
... [ປັບປຸງແກ້ໄຂເນື້ອໃນຂໍ້ມູນ] ...
}
ວິທີການ
ວິທີການແມ່ນຫນ້າທີ່ເອີ້ນວ່າໃນສະພາບການຂອງວັດຖຸ. ເກືອບທຸກວິທີການຕ້ອງການ
ມີການເຂົ້າເຖິງວັດຖຸທີ່ເຂົາເຈົ້າກໍາລັງຈັດການກັບ. ວັດຖຸ Prima ແມ່ນເຫັນໄດ້ໃນ C as
ຈັດການປະເພດຂໍ້ມູນ. ຕົວຈັບດັ່ງກ່າວແມ່ນຕົວຊີ້ໄປຫາຕົວຢ່າງວັດຖຸ, ເຊິ່ງໃນທາງກັບກັນ
ມີຕົວຊີ້ໄປຫາຕາຕະລາງວິທີການ virtual ຂອງວັດຖຸ ( VMT ). ເພື່ອອໍານວຍຄວາມສະດວກໃຫ້ OO-like
syntax, ພາລາມິເຕີ Handle ນີ້ແມ່ນເກືອບບໍ່ເຄີຍຖືກກ່າວເຖິງໃນວິທີການທັງຫມົດຂອງວັດຖຸ
ຄໍາອະທິບາຍຢູ່ໃນໄຟລ໌ cls, ເຖິງແມ່ນວ່າຈະຖືກນັບ implicit, ດັ່ງນັ້ນທຸກໆວິທີການ cls
ການປະກາດ
ວິທີການ void a( int x)
ສໍາລັບ object class Object ແມ່ນສະທ້ອນໃຫ້ເຫັນໃນ C as
void Object_a(ຈັດການດ້ວຍຕົນເອງ, int x)
ການປະກາດຫນ້າທີ່. ກົງກັນຂ້າມກັບຫນ້າທີ່ຫຸ້ມຫໍ່, gencls ນັ້ນບໍ່ສາມາດເຜີຍແຜ່ໄດ້ຖ້າ
ມັນບໍ່ສາມາດທີ່ຈະຈັດການກັບການບໍ່ໄດ້ຮັບການສະຫນັບສະຫນູນໃນຕົວກໍານົດການ unconvertible ໄດ້, ມີວິທີການ
ອອກຖະແຫຼງການດັ່ງກ່າວດ້ວຍວິທີການ. ການນໍາໃຊ້ຕົ້ນຕໍສໍາລັບການນັ້ນແມ່ນຊື່ວິທີການໄດ້ຮັບ
ສະຫງວນໄວ້ໃນ VMT ຂອງວັດຖຸ.
ວິທີການແມ່ນສາມາດເຂົ້າເຖິງໄດ້ໃນລະຫັດ C ໂດຍການອ້າງອິງຊື່ໂດຍກົງຂອງ "Handle self" ເປັນ.
ໂຄງປະກອບການທີ່ສອດຄ້ອງກັນ:
(((PSampleObject) self)-> ຕົນເອງ)-> sample_method(ຕົນເອງ, ...);
ວິທີການສາມາດມີຫນຶ່ງໃນຫົກຄໍານໍາຫນ້າທີ່ຄວບຄຸມການສ້າງລະຫັດ C:
ວິທີການ
ນີ້ແມ່ນປະເພດວິທີການທໍາອິດແລະພື້ນຖານທີ່ສຸດ. ມັນເປັນຊື່ prefix, "ວິທີການ" ແມ່ນ
ດັ່ງນັ້ນຈຶ່ງໄດ້ຖືກເລືອກເປັນຊື່ທີ່ອະທິບາຍຫຼາຍທີ່ສຸດ. ວິທີການຄາດວ່າຈະຖືກລະຫັດໃນ
C, ຈຸດຈັບວັດຖຸແມ່ນ implicit ແລະບໍ່ໄດ້ຖືກລວມເຂົ້າໃນຄໍາອະທິບາຍ .cls.
ວິທີການ void a()
ຜົນໄດ້ຮັບໃນ
void Object_a(ຈັດການດ້ວຍຕົນເອງ)
C ປະກາດ. ວິທີການທີ່ຖືກເຜີຍແຜ່ຈະປ່ຽນພາລາມິເຕີຂອງມັນໂດຍອັດຕະໂນມັດແລະຜົນໄດ້ຮັບ
ລະຫວ່າງ C ແລະ perl.
ສາທາລະນະ
ເມື່ອວິທີການທີ່ມີພາລາມິເຕີແລະ / ຫຼືຜົນໄດ້ຮັບທີ່ບໍ່ສາມາດອັດຕະໂນມັດ
ປ່ຽນລະຫວ່າງ C ແລະ perl ຕ້ອງໄດ້ຮັບການປະກາດ, ຫຼືການປະກາດຫນ້າທີ່ບໍ່ໄດ້
ເຫມາະກັບ C syntax, ຄໍານໍາຫນ້າ "ສາທາລະນະ" ຖືກໃຊ້. ວິທີການປະກາດດ້ວຍ "ສາທາລະນະ" ແມ່ນ
ຄາດວ່າຈະຕິດຕໍ່ສື່ສານກັບ perl ໂດຍວິທີການຂອງ XS (ເບິ່ງ perlxs ). ມັນຍັງເປັນ
ຄາດວ່າວິທີການ "ສາທາລະນະ" ສ້າງທັງຫນ້າທີ່ REDEFINED ແລະ FROMPERL (ເບິ່ງ
Prima::internals ສໍາລັບລາຍລະອຽດ). ຕົວຢ່າງແມ່ນມີຫຼາຍໃນທົ່ວແຫຼ່ງ Prima, ແລະຈະ
ບໍ່ໄດ້ສະແດງຢູ່ທີ່ນີ້. ວິທີການ "ສາທາລະນະ" ປົກກະຕິແລ້ວມີຜົນໄດ້ຮັບ void ແລະບໍ່ມີຕົວກໍານົດການ, ແຕ່
ນັ້ນບໍ່ສໍາຄັນຫຼາຍ, ເພາະວ່າ gencls ບໍ່ມີການປ່ຽນໃຈເຫລື້ອມໃສສໍາລັບວິທີການດັ່ງກ່າວ.
ການນໍາເຂົ້າ
ສໍາລັບວິທີການທີ່ບໍ່ສົມເຫດສົມຜົນໃນລະຫັດ C ແຕ່ໃນ perl ແທນທີ່ຈະ, gencls ສາມາດເປັນ
ບອກໃຫ້ຜະລິດ wrappers ທີ່ສອດຄ້ອງກັນໂດຍໃຊ້ "ນໍາເຂົ້າ" ຄໍານໍາຫນ້າ. ປະເພດນີ້ ກ
ວິທີການສາມາດເຫັນໄດ້ວ່າເປັນ "ວິທີການ" ພາຍໃນພາຍນອກ. ຟັງຊັນ "ນໍາເຂົ້າ" ບໍ່ຈໍາເປັນຕ້ອງມີ C
ຄູ່ກັນ, ຍົກເວັ້ນລະຫັດທີ່ສ້າງຂຶ້ນອັດຕະໂນມັດ.
ໄຟຟ້າສະຖິດ
ຖ້າວິທີການຕ້ອງສາມາດເຮັດວຽກໄດ້ທັງກັບແລະບໍ່ມີຕົວຢ່າງວັດຖຸ, ມັນຕ້ອງການ
ຈະຖືກນໍາຫນ້າດ້ວຍຄໍານໍາຫນ້າ "static". ວິທີການ "static" ແມ່ນຄ້າຍຄືກັນກັບ "ວິທີການ",
ຍົກເວັ້ນພາຣາມິເຕີທໍາອິດ "ຈັດການດ້ວຍຕົນເອງ" ບໍ່ໄດ້ຖືກປະກາດ implicitly. ຖ້າ "ສະຖິດ"
ວິທີການແມ່ນເອີ້ນວ່າໂດຍບໍ່ມີວັດຖຸ (ແຕ່ມີຫ້ອງຮຽນ), ເຊັ່ນ
ຫ້ອງຮຽນ::Object-> static_method();
ພາຣາມິເຕີທຳອິດຂອງມັນບໍ່ແມ່ນວັດຖຸແຕ່ເປັນສະຕຣິງ "Class::Object". ຖ້າວິທີການບໍ່ເຄີຍ
ຈັດການກັບວັດຖຸ, ມັນພຽງພໍທີ່ຈະໃຊ້ການປະກາດຂອງມັນ
static a( char * className = "");
ແຕ່ຖ້າເຮັດ, a
static a(SV * class_or_object = nil);
ການປະກາດແມ່ນຈໍາເປັນ. ໃນກໍລະນີສຸດທ້າຍລະຫັດ C ຕົວຂອງມັນເອງຕ້ອງກໍານົດສິ່ງທີ່ແນ່ນອນມີ
ໄດ້ຜ່ານ, ຖ້າເຄີຍ. ໃຫ້ສັງເກດວ່າຕົວກໍານົດການເລີ່ມຕົ້ນຢູ່ທີ່ນີ້: ວິທີການ "static" ແມ່ນປົກກະຕິແລ້ວ
ສາມາດເອີ້ນໄດ້ວ່າເປັນ
ຫ້ອງຮຽນ::ວັດຖຸ::static_method();
ບ່ອນທີ່ບໍ່ມີຕົວກໍານົດການຖືກສົ່ງກັບມັນ. ໂດຍບໍ່ມີພາລາມິເຕີມາດຕະຖານເຊັ່ນການໂທ
ສ້າງ 'ພາຣາມິເຕີບໍ່ພຽງພໍຜ່ານ' ຄວາມຜິດພາດ runtime.
weird
ພວກເຮົາບໍ່ສາມາດຊອກຫາຊື່ທີ່ດີກວ່າສໍາລັບມັນ. ຄໍານໍາຫນ້າ "weird" ຫມາຍເຖິງວິທີການທີ່ປະສົມປະສານ
ຄຸນສົມບັດທັງຈາກ "static" ແລະ "ສາທາລະນະ". ໃນຄໍາສັບຕ່າງໆອື່ນໆ, gencls ຜະລິດບໍ່ມີ
ລະຫັດການປ່ຽນໃຈເຫລື້ອມໃສແລະຄາດວ່າຈະບໍ່ມີ "ຈັດການຕົນເອງ" ເປັນຕົວກໍານົດການທໍາອິດສໍາລັບວິທີການດັ່ງກ່າວ.
ເປັນຕົວຢ່າງ Prima::Image::load ສາມາດສະແດງໄດ້, ເຊິ່ງສາມາດເອີ້ນວ່າການນໍາໃຊ້ກວ້າງ
spectrum ຂອງ semantics ການໂທຫາ (ເບິ່ງ Prima::image-load ສໍາລັບລາຍລະອຽດ).
c_ເທົ່ານັ້ນ
ດັ່ງທີ່ຊື່ຂອງມັນລະບຸ, "c_only" ແມ່ນວິທີການທີ່ມີຢູ່ໃນ VMT ແຕ່ບໍ່ແມ່ນ
ສາມາດເຂົ້າເຖິງໄດ້ຈາກ perl. ມັນສາມາດ overloaded ຈາກ C ເທົ່ານັ້ນ. ຍິ່ງໄປກວ່ານັ້ນ, ມັນໄດ້ຖືກອະນຸຍາດໃຫ້
ລົງທະບຽນຟັງຊັນ perl ທີ່ມີຊື່ຂອງວິທີການ "c_only", ແລະຍັງມີຫນ່ວຍງານເຫຼົ່ານີ້
ຈະເປັນເອກະລາດທັງຫມົດຈາກກັນແລະກັນ - overloading ຈະບໍ່ເກີດຂຶ້ນ.
NB: ວິທີການທີ່ມີຜົນໄດ້ຮັບແລະ / ຫຼືພາລາມິເຕີປະເພດຂໍ້ມູນທີ່ບໍ່ສາມາດປ່ຽນໄດ້
ອັດຕະໂນມັດ, ປ່ຽນຄໍານໍາຫນ້າຂອງພວກເຂົາເປັນ "c_only". ອາດຈະເປັນການປະພຶດທີ່ບໍ່ຖືກຕ້ອງ,
ແລະເງື່ອນໄຂດັ່ງກ່າວຕ້ອງສົ່ງສັນຍານຄວາມຜິດພາດ.
ອະສັງຫາ
Prima toolkit ແນະນໍາ entity ຊື່ຊັບສິນ, ທີ່ຄາດວ່າຈະທົດແທນວິທີການ
ຄູ່ທີ່ມີຫນ້າທີ່ແມ່ນເພື່ອໄດ້ຮັບແລະກໍານົດຕົວແປວັດຖຸພາຍໃນບາງ, ສໍາລັບການຍົກຕົວຢ່າງ,
ຊື່ວັດຖຸ, ສີ ແລະ ອື່ນໆ. ແທນທີ່ຈະມີວິທີການຄູ່ເຊັ່ນ Object::set_color ແລະ
Object::get_color, a property Object::color is devised. ຊັບສິນແມ່ນວິທີການທີ່ມີ
ການພິຈາລະນາພິເສດ, ໂດຍສະເພາະ, ໃນເວລາທີ່ມັນຖືກເອີ້ນວ່າບໍ່ມີພາລາມິເຕີ, ຮູບແບບ 'get'
ຫມາຍເຖິງ. ໃນທາງກົງກັນຂ້າມ, ຖ້າມັນຖືກເອີ້ນດ້ວຍຕົວກໍານົດການຫນຶ່ງ, ໂຫມດ 'ຊຸດ' ຈະຖືກກະຕຸ້ນ.
ໃຫ້ສັງເກດວ່າໃນທັງສອງ 'ຕັ້ງ' ແລະ 'get' invocations "Handle self" ຕົວກໍານົດການ implicit ທໍາອິດແມ່ນ.
ສະເຫມີ.
ຄຸນສົມບັດສາມາດປະຕິບັດດ້ວຍຕົວກໍານົດການທີ່ແຕກຕ່າງກັນ, ແຕ່ຄົງທີ່, ແລະປະຕິບັດ 'ຊຸດ'
ແລະຟັງຊັນ 'get' ພຽງແຕ່ສໍາລັບອັນດຽວ. ໂດຍຄ່າເລີ່ມຕົ້ນຕົວກໍານົດການພຽງແຕ່ implicit "Handle
ຕົນເອງ":
ຊັບສິນ char * ຊື່
ມີຄູ່ C
char * Object_name (ຈັບຕົນເອງ, Bool set, char * ຊື່)
ອີງຕາມຮູບແບບ, "Bool set" ແມ່ນ "ຄວາມຈິງ" ຫຼື "ຜິດ". ໃນໂຫມດ 'ຕັ້ງ' ເປັນລະຫັດ C
ຜົນໄດ້ຮັບຖືກຍົກເລີກ, ໃນໂຫມດ 'get' ຄ່າພາລາມິເຕີແມ່ນບໍ່ໄດ້ກໍານົດ.
syntax ສໍາລັບຄຸນສົມບັດຫຼາຍພາລາມິເຕີແມ່ນ
property long pixel(int x, int y);
ແລະລະຫັດ C
long Object_pixel(ຈັບເອງ, Bool set, int x, int y, long pixel)
ໃຫ້ສັງເກດວ່າໃນກໍລະນີຫຼາຍພາລາມິເຕີ, ຕົວກໍານົດການປະກາດຫຼັງຈາກຊື່ຊັບສິນແມ່ນ
ເລີ່ມຕົ້ນສະເຫມີ, ໃນທັງສອງໂຫມດ 'ຊຸດ' ແລະ 'get'.
ຕົວຢ່າງ ຕົວແປ
ທຸກໆວັດຖຸແມ່ນມີລັກສະນະສະເພາະພາຍໃນຂອງມັນ. Gencls syntax ອະນຸຍາດໃຫ້ a
ການປະກາດຕົວແປ, ສໍາລັບຕົວແປທີ່ຈັດສັນສໍາລັບທຸກໆຕົວຢ່າງວັດຖຸ. ເຖິງແມ່ນວ່າ
ການກວດສອບປະເພດຂໍ້ມູນບໍ່ໄດ້ດໍາເນີນການສໍາລັບຕົວແປ, ແລະການປະກາດຂອງພວກເຂົາພຽງແຕ່ໄດ້ຮັບ
ຄັດລອກ 'ເປັນ', ການປະກາດ C ທີ່ຊັບຊ້ອນທີ່ກ່ຽວຂ້ອງກັບ array, struct ແລະ function pointers ແມ່ນ
ບໍ່ຮັບຮູ້. ໃນຖານະເປັນການແກ້ໄຂ, ຕົວຊີ້ໄປຫາຫນ່ວຍງານ typedef'd ຖືກນໍາໃຊ້. ຕົວຢ່າງ:
ວັດຖຸ SampleObject {
intx;
ບັນຊີລາຍຊື່;
ໂຄງສ້າງ { int x } s; # ປະກາດຜິດກົດໝາຍ
}
ຕົວແປແມ່ນສາມາດເຂົ້າເຖິງໄດ້ໃນລະຫັດ C ໂດຍການອ້າງອີງຊື່ໂດຍກົງຂອງ "ຈັດການດ້ວຍຕົນເອງ" ເປັນ.
ໂຄງປະກອບການທີ່ສອດຄ້ອງກັນ:
((PSampleObject) self)-> x;
AUTHORS
Dmitry Karasik,[email protected]>. Anton Berezin,[email protected]>.
ໃຊ້ prima-gencls ອອນໄລນ໌ໂດຍໃຊ້ບໍລິການ onworks.net