Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π˜ΡΠΊΡƒΡΡΡ‚Π²ΠΎ программирования для UnixΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 72

Автор Π­Ρ€ΠΈΠΊ Π Π΅ΠΉΠΌΠΎΠ½Π΄

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡΡ‚Ρ‹, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠ΅ с Lisp ΠΈ Java, Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ Π΄Π°Π½Π½ΡƒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΡƒ интроспСкциСй (introspection). Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… языках ΠΎΠ½Π° называСтся ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ мСтаклассов (metaclass hacking) ΠΈ, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, считаСтся "Ρ‡Π΅Ρ€Π½ΠΎΠΉ ΠΌΠ°Π³ΠΈΠ΅ΠΉ", понятной Ρ‚ΠΎΠ»ΡŒΠΊΠΎ "посвящСнным". Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ- ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… языков данная ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠ° Π½Π΅ поддСрТиваСтся Π²ΠΎΠΎΠ±Ρ‰Π΅, Π° Π² Ρ‚Π΅Ρ… языках, Π³Π΄Π΅ ΠΎΠ½Π° поддСрТиваСтся (срСди Π½ΠΈΡ… Perl ΠΈ Java), ΠΎΠ½Π° часто слоТна ΠΈ Π½Π΅Π½Π°Π΄Π΅ΠΆΠ½Π°. Однако Π² языкС Python срСдства интроспСкции ΠΈ программирования мСтаклассов ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ доступны.

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 9.3 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π° ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ со строки 1895 Π² вСрсии 1.43.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 9.3. Код мСтакласса copy_instance

def copy_instance(toclass, fromdict):

#Make a class object of given type from a conformant dictionary.

 class_sig = toclass.__dict__.keys(); class_sig.sort()

 dict_keys = fromdict.keys(); dict_keys.sort()

 common = set_intersection(class_sig, dict_keys)

 if 'typemap' in class_sig:

  class_sig.remove('typemap')

 if tuple(class_sig) != tuple(dict_keys):

  print "Conformability error"

#print "Class signature: " + `class_sig`

#print "Dictionary keys: " + `dict_keys`

  print "Not matched in class signature: "+ \

   `set_diff(class_sig, common)`

  print "Not matched in dictionary keys: "+ \

   `set_diff(dict_keys, common)`

  sys.exit(1)

 else:

  for x in dict_keys:

   setattr(toclass, x, fromdict[x])

Π‘ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ прСдставляСт ΠΊΠΎΠ΄ контроля ошибок, учитывая Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Ρ‡Π»Π΅Π½Ρ‹ класса ΠΈ гСнСрация ΠΎΡ‚Ρ‡Π΅Ρ‚Π° --configdump Π²Ρ‹ΠΏΠ°Π»ΠΈ ΠΈΠ· синхронизации. Вакая ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Π² случаС возникновСния сбой Π² ΠΊΠΎΠ΄Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ Π½Π° Ρ€Π°Π½Π½Π΅ΠΉ стадии, Ρ‚.Π΅. рСализуСтся ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ исправности. Π“Π»Π°Π²Π½ΠΎΠΉ Ρ‡Π°ΡΡ‚ΡŒΡŽ ΠΊΠΎΠ΄Π° ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π΄Π²Π΅ послСдниС строки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ Π² классС ΠΈΠ· ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Ρ‡Π»Π΅Π½ΠΎΠ² Π² словарС. Π”Π°Π½Π½Ρ‹Π΅ строки эквивалСнтны ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ строкам.

def copy_instance(toclass, fromdict):

 for x in fromdict.keys():

  setattr(toclass, x, fromdict[x])

Если Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ ΠΊΠΎΠ΄ Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΆΠ΅ прост, Ρ‚ΠΎ вСсьма вСроятно, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π²Π΅Ρ€Π΅Π½. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 9.4 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΊΠΎΠ΄, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Π΄Π°Π½Π½Ρ‹ΠΉ мСтакласс.

ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠΌ Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ 3 уровня ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° (конфигурация/сСрвСр/ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ), устанавливая ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ уровня Π² списки, содСрТащиСся Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ Π±ΠΎΠ»Π΅Π΅ высокого уровня. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ мСтакласс copy_instance управляСтся Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈ являСтся ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΠ±Ρ‰ΠΈΠΌ, Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΎ всСх 3 уровнях для 3 Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².

Π”Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ β€” ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½ΠΎΠ²ΠΎΠΉ ΡˆΠΊΠΎΠ»Ρ‹. Π―Π·Ρ‹ΠΊ Python Π±Ρ‹Π» создан Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΠΏΠΎΠ·Π΄Π½Π΅Π΅ 1990 Π³ΠΎΠ΄Π°. Однако ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΡ‚Ρ€Π°ΠΆΠ°Π΅Ρ‚ ΠΈΠ΄Π΅ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ ΠΊ Unix-традициям 1969 Π³ΠΎΠ΄Π°. Если Π±Ρ‹ Ρ€Π°Π·ΠΌΡ‹ΡˆΠ»Π΅Π½ΠΈΡ Π½Π°Π΄ Unix-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ, ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΡƒΠ΅ΠΌΡ‹ΠΌ ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²Π΅Π½Π½ΠΈΠΊΠ°ΠΌΠΈ, Π½Π΅ Π½Π°ΡƒΡ‡ΠΈΠ»ΠΈ Π±Ρ‹ Π°Π²Ρ‚ΠΎΡ€Π° "конструктивной Π»Π΅Π½ΠΈ" β€” настаивая Π½Π° ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΌ использовании ΠΊΠΎΠ΄Π° ΠΈ ΠΎΡ‚ΠΊΠ°Π·Π΅ ΠΎΡ‚ написания Π΄ΡƒΠ±Π»ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎΡΡ ΡΠ²ΡΠ·ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΊΠΎΠ΄Π° Π² соотвСтствии с ΠΏΡ€Π°Π²ΠΈΠ»ΠΎΠΌ SPOT β€” ΠΎΠ½ ΠΌΠΎΠ³ Π±Ρ‹ "ΡƒΠ΄Π°Ρ€ΠΈΡ‚ΡŒΡΡ" Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° Π½Π° языкС Python. Π“Π»Π°Π²Π½ΠΎΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ сама ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° fetchmail ΠΌΠΎΠ³Π»Π° Π±Ρ‹ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ Π² синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ fetchmailconf, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½ΠΈΠΊΠΎΠ³Π΄Π° Π±Ρ‹ Π½Π΅ ΠΏΡ€ΠΈΡˆΠ»ΠΎ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 9.4. Π’Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ контСкст для copy_instance

#БлоТная Ρ‡Π°ΡΡ‚ΡŒ - инициализация ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈΠ· глобального класса

#`configuration'.

#`Configuration' - Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ Π΄Π΅Ρ€Π΅Π²Π°,

#ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ планируСтся ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ

Configuration = Controls()

copy_instance(Configuration, configuration)

Configuration.servers = [];

for server in configuration['servers']:

 Newsite = Server()

 copy_instance(Newsite, server)

 Configuration.servers.append(Newsite)

 Newsite.users = [];

 for user in server['users']:

  Newuser = User()

  copy_instance(Newuser, user)

  Newsite.users.append(Newuser)

Π”Ρ€ΡƒΠ³ΠΎΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ (Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ мСтакласс copy_instance ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±Ρ‰ΠΈΠΌ) происходит ΠΈΠ· Unix-Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΈ ΡΡ‚Π°Ρ€Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ поиска способов ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ кодирования Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ. Но особСнно, Unix-программисты ΠΏΡ€ΠΈΠ²Ρ‹ΠΊΠ»ΠΈ ΠΊ написанию спСцификаций для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ синтаксичСских Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ языков Ρ€Π°Π·ΠΌΠ΅Ρ‚ΠΊΠΈ. Π­Ρ‚ΠΎ скоро ΠΏΡ€ΠΈΠ²Π΅Π»ΠΎ ΠΊ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ, Ρ‡Ρ‚ΠΎ ΠΎΡΡ‚Π°Π»ΡŒΠ½Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° ΠΏΡƒΡ‚Π΅ΠΌ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠ±Ρ‰Π΅Π³ΠΎ ΠΎΠ±Ρ…ΠΎΠ΄Π° Π΄Π΅Ρ€Π΅Π²Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ структуры. Для Ρ‡Π΅Ρ‚ΠΊΠΎΠ³ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ΠΈ проСктирования Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π±Ρ‹Π»ΠΎ Π΄Π²Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… (ΠΎΠ΄ΠΈΠ½ Π½Π°Π΄ Π΄Ρ€ΡƒΠ³ΠΈΠΌ) этапа создания ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, управляСмой Π΄Π°Π½Π½Ρ‹ΠΌΠΈ.

Π˜Π½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ описанному ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΎΠ±Ρ‹ΠΊΠ½ΠΎΠ²Π΅Π½Π½ΠΎ дСйствСнным. РассматриваСмый ΠΊΠΎΠ΄ Π±Ρ‹Π» написан Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ 90 ΠΌΠΈΠ½ΡƒΡ‚, Π±Ρ‹Π» работоспособСн ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ запускС ΠΈ с Ρ‚Π΅Ρ… ΠΏΠΎΡ€ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠ½ΠΎΠ³ΠΈΡ… Π»Π΅Ρ‚ оставался ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ (СдинствСнный сбой ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ΅Π» ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ситуации Π² присутствии Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ пСрСкоса вСрсий). Π”Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ содСрТит ΠΌΠ΅Π½Π΅Π΅ 40 строк ΠΈ Π²Π΅Π»ΠΈΠΊΠΎΠ»Π΅ΠΏΠ½ΠΎ прост. НС сущСствуСт способа, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ создания Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° ΠΌΠΎΠ³ Π±Ρ‹ привСсти ΠΊ созданию Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΆΠ΅ удобства сопровоТдСния, Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ надСТности ΠΈΠ»ΠΈ компактности. ΠŸΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ использованиС ΠΊΠΎΠ΄Π°, ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½ΠΈΠ΅, ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅, ΠΎΡ€Ρ‚ΠΎΠ³ΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ β€” Дзэн ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы Unix Π² дСйствии.

Π’ Π³Π»Π°Π²Π΅ 10 рассматриваСтся синтаксис Ρ„Π°ΠΉΠ»Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ fetchmail Π² качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° стандартного shell-ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚Π°Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° для ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ². Π’ Π³Π»Π°Π²Π΅ 14 fetchmailconf ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΌΠΎΡ‰Π½ΠΎΡΡ‚ΡŒ языка Python Π² быстрой Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ GUI-интСрфСйсов.

9.2. ГСнСрация ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Π°Ρ систСма Unix оснащСна нСсколькими ΠΌΠΎΡ‰Π½Ρ‹ΠΌΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ ΠΊΠΎΠ΄Π° ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ назначСния, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ для Ρ‚Π°ΠΊΠΈΡ… Ρ†Π΅Π»Π΅ΠΉ, ΠΊΠ°ΠΊ созданиС лСксичСских Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² (tokenizers) ΠΈ синтаксичСских Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ²; ΠΎΠ½ΠΈ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² Π³Π»Π°Π²Π΅ 15. Однако ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π±ΠΎΠ»Π΅Π΅ простыС, лСгковСсныС Π²ΠΈΠ΄Ρ‹ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для облСгчСния Ρ€Π°Π±ΠΎΡ‚Ρ‹ программиста ΠΈ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ знания Ρ‚Π΅ΠΎΡ€ΠΈΠΈ компиляторов ΠΈΠ»ΠΈ написания ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΈ (ΠΏΠΎΠ΄Π²Π΅Ρ€ΠΆΠ΅Π½Π½ΠΎΠΉ ошибкам).

НиТС приводится Π΄Π²Π° ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… ΡƒΡ‡Π΅Π±Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°.

9.2.1. Π£Ρ‡Π΅Π±Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€: гСнСрация ΠΊΠΎΠ΄Π° для ascii-дисплССв

ЗапущСнная Π±Π΅Π· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ascii Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ экран справочной ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΏΠΎ использованию, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ распСчаткС, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 9.5.

Π”Π°Π½Π½Ρ‹ΠΉ экран достаточно Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ спроСктирован, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒΡΡ Π² 23 строки ΠΈ 79 ΠΊΠΎΠ»ΠΎΠ½ΠΎΠΊ, поэтому ΠΎΠ½ помСщаСтся Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΌ ΠΎΠΊΠ½Π΅ 24Γ—80.

Π’Π°Π±Π»ΠΈΡ†Ρƒ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π²ΠΎ врСмя выполнСния, Ρ‚.Π΅. Π½Π° Π»Π΅Ρ‚Ρƒ. Подгонка дСсятичных ΠΈ ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½Ρ‹Ρ… столбцов Π±Ρ‹Π»Π° Π±Ρ‹ достаточно простой. Однако сущСствуСт достаточно Π½Π΅ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ…, Π΄Π΅Π»Π°ΡŽΡ‰ΠΈΡ… ΠΊΠΎΠ΄ ΠΊΡ€Π°ΠΉΠ½Π΅ Π½Π΅ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ, случаСв ΠΎΡ‚ пСрСнСсСния строк Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π² Π½ΡƒΠΆΠ½Ρ‹Ρ… мСстах Π΄ΠΎ Π²Ρ‹Π²ΠΎΠ΄Π° Ρ‚Π°ΠΊΠΈΡ… Π½Π΅ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΡ‹Ρ… символов, ΠΊΠ°ΠΊ NUL, вмСсто ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… символов. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, столбцы понадобилось Π±Ρ‹ Π½Π΅Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎ Π·Π°ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π΅Π»Π°ΠΌΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΡƒΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒΡΡ Π² 79 ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°Ρ…. Но любой Unix-программист автоматичСски Π²Ρ‹Ρ€Π°ΠΆΠ°Π» Π±Ρ‹ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΊΠ°ΠΊ Π±Π»ΠΎΠΊ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ» Π±Ρ‹ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹.

Π‘Π°ΠΌΡ‹ΠΌ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹ΠΌ способом создания справочного экрана Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строки Π² C-ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π² исходном ΠΊΠΎΠ΄Π΅ ascii.с, Π° Π·Π°Ρ‚Π΅ΠΌ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄, проходящий Ρ‡Π΅Ρ€Π΅Π· ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, Π²Ρ‹ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ строки. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ C-ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° (Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠ΅ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΠΈ строк, строковыС ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ, запятыС) удлиняли Π±Ρ‹ строки Π±ΠΎΠ»Π΅Π΅ 79 символов. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π»ΠΎ Π±Ρ‹ ΠΊ пСрСносу строк ΠΈ услоТнило Π±Ρ‹ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ внСшнСго Π²ΠΈΠ΄Π° ΠΊΠΎΠ΄Π° ΠΊ Π²Π½Π΅ΡˆΠ½Π΅ΠΌΡƒ Π²ΠΈΠ΄Ρƒ Π²Ρ‹Π²ΠΎΠ΄Π°, Ρ‡Ρ‚ΠΎ, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, услоТнило Π±Ρ‹ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ справочного дисплСя, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈ Π±Π΅Π· этого слоТно Π±Ρ‹Π»ΠΎ ΡƒΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² экран Π½Π° 24Γ—80 растровых ячССк.

Π‘ΠΎΠ»Π΅Π΅ слоТный ΠΌΠ΅Ρ‚ΠΎΠ΄ использования Ρ€Π΅ΠΆΠΈΠΌΠ° вставки строк Π² прСпроцСссорС ANSI Π‘ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρƒ Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹. По сущСству, любой способ явного Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² ΠΊΠΎΠ΄ справочного экрана задСйствовал Π±Ρ‹ ΠΏΡƒΠ½ΠΊΡ‚ΡƒΠ°Ρ†ΠΈΡŽ Π² Π½Π°Ρ‡Π°Π»Π΅ ΠΈ ΠΊΠΎΠ½Ρ†Π΅ строки, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½Π΅ Π±Ρ‹Π»ΠΎ мСста[94]. А ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° экран Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° Π²ΠΎ врСмя выполнСния выглядСло Π½Π΅Π½Π°Π΄Π΅ΠΆΠ½ΠΎ. Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ², Ρ„Π°ΠΉΠ» ΠΌΠΎΠ³ Π±Ρ‹Ρ‚ΡŒ утСрян.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 9.5. Π‘ΠΏΡ€Π°Π²ΠΊΠ° ΠΏΠΎ использованию ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ascii

Usage: ascii [-dxohv] [-t] [char-alias...]

 -t = one-line output -d = Decimal table -o = octal table -x = hex table

 -h = This help screen -v = version information

Prints all aliases of an ASCII character. Args may be chars, C \-escapes,

English names, ^-escapes, ASCII mnemonics, or numerics in decimal/octal/hex.


Dec Hex     Dec Hex     Dec Hex  Dec Hex   Dec Hex   Dec Hex   Dec Hex   Dec Hex

0   00  NUL 16  10  DLE 32  20   48  30  0 64  40  @ 80  50  P 96  60  ` 112 70 p

1   01  SOH 17  11  DC1 33  21 ! 49  31  1 65  41  A 81  51  Q 97  61  a 113 71 q

2   02  STX 18  12  DC2 34  22 " 50  32  2 66  42  B 82  52  R 98  62  b 114 72 r

3   03  ETX 19  13  DC3 35  23 # 51  33  3 67  43  C 83  53  S 99  63  c 115 73 s