რაში გამომადგება ლისპი დღეს

oh wow,
so language holy wars,
such new.
შესაფერისი ჰაიკუ

ბოლო დროს მე და საფარა ჰასკელი vs ლისპი დისკუსიამდე მივედით. მე დროს აღარ ვხარჯავ ლისპის ევანგელისტობაზე, მაგრამ საფარამ დამარწმუნა, რომ ლისპზე რამე დამეწერა, რომ ქართულადაც იყოს მოკლედ, გასაგებ ენაზე ჩამოყალიბებული ლისპის უპირატესობები.

ლისპი ყველაზე ძლიერი პროგრამირების ენაა და სამუდამოდ დარჩება1 2 3. ეს რამდენიმე ფაქტორის დამსახურებაა. დანარჩენ პოსტში მოკლედ ავხსნი ლისპის მთავარ უპირატესობებს და რაში შეიძლება გამოგვადგეს დღესვე.

ფრჩხილები და s-expressions

ლისპის სორს კოდი არის გამოსახულებები, რომლებიც იწერება ფრჩხილებით. თუ ჯავასკრიპტში ან სხვა ენებში გვჭირდება მაგ. (){};=,.->[]*&^%$#@:<>?|! ეს სიმბოლოები, ლისპში მხოლოდ ()# ეს სიმბოლოები გვყოფნის. ყველაფერი ფრჩხილებში ზის, ამიტომ ზედმეტ სიმბოლოებზე, . უნდა თუ -> -ზე ფიქრი და Shift-ის ხმარება აღარ გიწევს. კოდიც გაცილებით მარტივად გამოიყურება, უფრო მარტივი საწერია და პროგრამულად მანიპულაციაც გაცილებით ადვილია.

მაკროები

თუ ლისპის მაკროები არ გამოგიყენებია, მაშინ მაკროების ნამდვილი სიმძლავრე არ იცი. C-ს მაკროები არ ითვლება, მხოლოდ ტექსტურ ჩანაცვლებას ახდენს. ლისპში მაკრო არის ფუნქცია, რომელსაც პარამეტრად გადაეცემა კოდი და პასუხად აბრუნებს (და ძირითადად ასრულებს) ამ კოდის გარდაქმნილ ვარიანტს. მაგალითად ფაილის ბოლოში რომ ჩაამატო “abc”, უნდა გააკეთო fopen();fwrite(“abc”);fflush();fclose(); ეს ოპერაციები ყოველთვის ერთიდაიგივეა, მაგრამ ყოველ ჯერზე თავიდან უნდა აკრიფო. ლისპში არის (წინასწარ დაწერილი) with-open-file, რომელსაც გადასცემ მარტო fwrite() ნაწილს და “ჰედერს” და “ფუტერს” თვითონ გაუკეთებს. ვიცი რო ეხლა წამოხტებიან ინტრიგანები (სახელებს არ ვახსენებ) და იტყვიან, გააკეთებ withOpenFile ფუნქციას და callback-ად გადასცემ fwrite-იან ფუნქციასო.

p.s. ქვემოთ ფსევდოკოდია.

var name = “luka”; fhandle = fopen(“file.txt”); fwrite(fhandle, name); fflush(); fclose();

(let ((name “luka”)) (with-open-file (“file.txt”) (fwrite name)))

function withOpenFile(filename, callback){
fhandle = fopen(“file.txt”);
callback(fhandle);
fflush();
fclose();
}

var name = “luka”; withOpenFile(“file.txt”, function(handle){ fwrite(handle, name); }

ჯერ ერთი, ლისპის ვარიანტი უფრო სუფთაა – ანონიმური ფუნქციის შექმნა უფრო დიდია, ვიდრე შიგნით ჩასაწერი კოდი. მეორე – ლისპის ვერსიაში fwrite-ს რომ პირველ არგუმენტად fhandle სჭირდება, ეგ fwrite გამოძახება მაკრომ დაინახა და ავტომატურად ჩაუწერა თავისივე გაკეთებული fhandle და “name” მეორე ადგილზე გადაიტანა. აი ამას, რომ კოდში კონკრეტული ფუნქციის გამოძახება იპოვოს და გადაულაგოს პარამეტრები, ვერცერთ ენაში ვერ გააკეთებთ, მითუმეტეს სინტაქსური შემოწმების და ტიპების შემოწმების გარანტიით. და კიდევ უსასრულო ვარიანტებია, რას ვერ გააკეთებ სხვა ენაში.

არავითარი სინტაქსი

ლისპს სინტაქსი არ აქვს. ერთადერთი წესი ესეთია: იხსნება ფრჩხილი, პირველი ელემენტი ფუნქციაა, დანარჩენი პარამეტრები. (+ 1 (* 2 3)) იგივეა რაც 1 + 2 * 3. (defun plus (a b) (+ a b)) იგივეა რაც function plus (a, b){ return a + b; }.

defun, defmacro და ა.შ., OOP სისტემაც კი, არ არის კომპილატორში ჩაშენებული – ჩვეულებრივი ლისპის user კოდია, და თქვენც შეგიძლიათ ზუსტად ისეთივე ან სულ სხვანაირი OOP სისტემა ან რამე სხვა თავისი სინტაქსით ისე ჩააშენოთ ლისპში, თითქოს თავიდანვე იქ იყო. და გამოყენებაც ისეთივე მარტივი იქნება, როგორიც ჩაშენებული სისტემის. ჯავასკრიპტში მარტო პროტოტიპებია და ასეც დარჩება. ჯავაში მხოლოდ ერთი OOP-ა და ასეც დარჩება.

დაპროგრამებადი სინტაქსი

ლისპში მაკროების გამოყენებით შეგიძლია საკუთარი სინტაქსი შექმნა და იმაში წერო. ანუ DSL (Domain-specific Language)-ების დასაწერად ლისპი იდეალურია. როგორც პოლ გრეჰემმა აღწერა, ლისპში პროგრამის წერისას ნელნელა ისეთ ფუნქციონალს და სინტაქსს ამატებ ენას, რომ საბოლოოდ გგონია, რომ ვიღაცამ სპეციალურად ამ პროგრამის დასაწერად შეგიქმნა ენა.

მაგალითად მე მინდა რომ როცა დავწერ “defhandler /login POST (username password) performlogin(username password) “. სხვა ენებში ეს შეუძლებელია, და სხვა ენებში ან სპეციალურ data სტრუქტურებში წერ მასივში, ან routes ფაილი გაქვს და იქ წერ სპეციალური სინტაქსით. ლისპში ძალიან მარტივია, დაწერ მაკროს, რომელმაც იცის, რომ პირველ ადგილზე URL-ია, მეორეზე HTTP method, მესამეზე პარამეტრები, მეოთხეზე კოდი, რომელიც შესრულდება, და გარდაქმნის ამას იმ რეალურ კოდად, რომელიც აქამდე გიწევდა ხოლმე.

დაპროგრამებადი კოდი

სხვა ენებში შეგვიძლია მხოლოდ რიცხვებზე, სტრიქონებზე, მასივებზე, (კლასის) ობიექტებზე და ზოგჯერ ფუნქციებზე მუშაობა. ლისპში შეგიძლია კოდზე მუშაობაც, ოღონდ სტრიქონში კი არა js სტილში “var x = 5;”, არამედ ისე, რომ კომპაილერსაც ესმის და შეცდომებსაც იჭერს. ჯავასკრიპტში შეგიძლია თქვა, ეს არის ფუნქცია ორი პარამეტრით. ლისპში შეგიძლია თქვა: ეს არის ამ ორპარამეტრიანი ფუნქციის ამ პარამეტრების გადაცემით გამოძახება. გამოძახებებს ჯავასკრიპტში ცვლადში ვერ შეინახავ (ისე, რომ ენამ იცოდეს, რომ ეს გამოძახებაა), ვერც გარდაქმნი და ვერც პარამეტრებს შეუცვლი პროგრამულად. ლისპში შეგიძლია გამოძახების currying პროგრამულად, ისე, რომ წინასწარ არ იცოდე რომელი ფუნქციის გამოძახებაა ან საერთოდ, როგორი ფუნქციაა და რას აკეთებს. + ბონუსად უფასო error checking ამ ფუნქციის პარამეტრებზე და ტიპებზე, მიუხედავად იმისა, რომ გამოძახება არ სრულდება. WTF? ჰო, ეს შესაძლებელია ;) და ეს მხოლოდ კონკრეტული მაგალითია, სხვა ყველაფერიც შეიძლება.

სწრაფი, საიმედო, კომფორტული – აირჩიე სამი

ლისპში შეგიძლია dynamic typing-იც და static typing-იც (optional static typing). მიუხედავად ამისა, ლისპში შეგიძლია დაწერო კოდი, რომელიც ზოგჯერ C-ზე სწრაფიცაა, და დინამიური ტიპების შემთხვევაშიც კი გაქვს type checking. WTF? ჰო, ეს შესაძლებელია ;)

მოსახერხებელი დეველოპმენტი - ინკრემენტული პროგრამირება

ლისპში შეგიძლია თან წერო და თან აკრეფის პროცესში ტესტო კოდი. დაწერე/დააკომპილირე/გაუშვი ეს ციკლი არაა საჭირო. მე მაქვს ვებ-სერვერი, სადაც კოდის განახლების შემთხვევაში მომხმარებლებს სესიები არ ეთიშებათ (ეს PHP-საც აქვს, მაგრამ აქ გაშვებულ .EXE ფაილში, ასემბლერში დაკომპილირებული კოდის პროცესის მემორიშივე ერთი ბრძანებით დააფდეითებაზეა საუბარი). WTF? ჰო, ეს შესაძლებელია ;)

მაკროების სრული სიძლიერე სხვა ენებისთვისაც

მაგ. ჯავასკრიპტს არ აქვს მაკროები. მერე რა? ლისპში შეგიძლია დაწერო მაკროები ჯავასკრიპტისთვის და ამ მაკროებით ჯავასკრიპტსაც (არამარტო) დაუმატო ახალი სინტაქსი, და ჯავასკრიპტი წერო შენი საკუთარი სინტაქსით. მაგალითად დაწერ += მაკროს და (map (lambda (a) (+= a 5)) (a b c d e)) იგივეს იზამს, და შესრულდება Chrome-ს V8-ში, ბრაუზერის VM-ში, რასაც “a+=5; b+=5; c+=..ა.შ” რო დაგეწერა. WTF? ჰო, ეს შესაძლებელია ;)

ფუნქციონალური პროგრამირება

ფუნქციონალური პროგრამირება ლისპისთვის უნიკალური არ არის, მაგრამ ლისპმა შემოიტანა. მარტივია პირველი ყოფნა, როცა 1958 წელს გამოგიგონებენ ))) ლისპი კოდის მათემატიკურად ჩასაწერად გამოიგონეს, ამიტომ ფპ-ს ჩადება მათემატიკის გავლენა უფრო იყო.

პროგრამირების ენის არსში ჩაწვდომა

ლისპში წერისას პირდაპირ AST-ში4 წერ. მიუხედავად ამისა, მაინც ჩვეულებრივი კოდია. ლისპი იმისთვის შეიქმნა, რომ გამოთვლები და პროგრამული ოპერაციები მათემატიკურად აღეწერათ. ანუ ოპერაციების მათემატიკური ნოტაცია. ოდნავი შეხება მაინც თუ გაქვთ მათემატიკასთან, მიხვდებით, ეს რამხელა რამეს ნიშნავს. სხვა ყველა დანარჩენი ენა, ასემბლერიც კი, არის კომპიუტერისთვის იმის სათქმელად, რა გააკეთოს. ლისპის კოდი კი პირდაპირ წარმოადგენს იმ ალგორითმის არსს, რა ლოგიკაც გაქვს, რა კეთდება (აზრობრივ და არა პროცესორის დონეზე), და შეგიძლია მისი აღება და მათემატიკურად განხილვა.

OOP

გაგიკვირდათ ხო აქ რო ლისპი მოხვდა? ლისპი პირველი OOP (ობიექტზე ორიენტირებული) ენაა. WTF? ჰო, ეს სიმართლეა :) )5

რაც მთავარია, Common Lisp-ს გაცილებით დახვეწილი OOP სისტემა აქვს, ვიდრე ჯავას. სიმართლე რომ გითხრათ, ჯავა არც არის დიდად OOP ენა :) 6.

პროცედურული/ფუნქციონალური/ობიექტზე ორიენტირებული/ლოგიკური/ასპექტზე ორიენტირებული/კონტრაქტზე ორიენტირებული/კონტექსტზე ორიენტირებული/პარალელური პროგრამირება/დაამატე შენი ორიენტაცია და იმაზე ორიენტირებული

Common Lisp მულტიპარადიგმული ენაა, ანუ როგორც გინდა წერე – გინდა პროცედურულად, გინდა ფუნქციონალურად, გინდა OOP-ში, თუგინდა აურიე (OOP მოდაა და მეტი არაფერი, მეთოდის დისპეჩისას პირველ არგუმენტად დაამატე ინსტანსი, C-ს პროგრამისტები OOP-ს არ ქონის მიუხედავად ძალიან მშვენივრად ანაცვლებენ dog1.bark(“loud”)-ს m_bark(dog1, “bark”-ით)).

როცა გამოჩნდა aspect-oriented programming, ჯავაში სპეციალურად სხვა ენაში უნდა წერო და იმას თარგმნის მერე რაღაც უტილიტა ჯავაში. ლისპში ერთი-ორი მაკრო დაამატეს და voila – დაემატა aspect-oriented. იგივე მოხდა context-oriented-ზეც. თან რაც მთავარია, კომპილატორში არავის არაფერი არ შეუცვლია – ჩვეულებრივი ბიბლიოთეკის სახით იტვირთება და ვიღაც ჩვენნაირმა ტიპებმა დაწერეს, ლისპის იმპლემენტაციის ავტორებს არც გაუგიათ.

ლისპის მთავარი პლიუსები ესაა. მიუხედავად ამისა, ლისპის ძლიერი მხარე იმაშია, რომ ყველა პატარა დეტალში რაღაცით ჯობია ალტერნატივებს, და არა ამ რამდენიმე ფუნქციის ჩამონათვალში.

ასევე ლისპს აქვს მინუსები – ბიბლიოთეკების შედარებით ნაკლებობა (უფრო SDK-ებზეა, მაგრამ მე ჯერ 5 წლის მანძილზე პრობლემა არ შემქმნია, რამე რო იყოს ბიბლიოთეკასაც დაწერ, დამიწერია და გაცილებით მარტივია ვიდრე სადმე სხვაგან). community გაცილებით პატარაა, ვიდრე პითონის, PHP-ს, ჯავას ან C#-ის, მაგრამ მე 100 ლისპის ჰაკერი მირჩევნია 100,000 PHP-ს პროგრამისტს, და ალბათ თქვენც :) პლატფორმებთან გაგიკვირდებათ და პრობლემა თითქმის არ ექმნება, ყოველ შემთხვევაში, PHP-ზე, Python-ზე, Ruby-ზე და Java-ზე და ა.შ. გაცილებით ნაკლები, ყველასთან მქონია შეხება.

ლისპის ერთი “მინუსი” ისაა, რომ ყველაფერში ვერ გამოიყენებ. ბლოგისთვის ლისპი ტყუილად არ უნდა დახარჯო. ჩემი მარტივი რჩევაა ლისპი მარტო იმ პროექტებში გამოიყენო, რომელზეც იმასაც კი ვერ ხვდები, კეთება საიდან და როგორ დაიწყო.

(publish)

(quit)

 

1. http://www.paulgraham.com/icad.html , What made Lisp different-ის ბოლოსწინა პარაგრაფი. პოლ გრეჰემმა ძალიან მარტივად შენიშნა, რომ ლისპზე ძლიერი პროგრამირების ენას მაკროების გარეშე ვერ შექმნი, მაკროებით კი ლისპის ახალი დიალექტი გამოვა, ანუ ისევ ლისპი.

2. ყველაზე ძლიერია, მაგრამ იშვიათ შემთხვევაშია საუკეთესო არჩევანი. ყოველთვის არ გჭირდება ესტონ სუპერ ქანჩი, ზოგჯერ მარტივი “ატვიორტკაც” გყოფნის.

3. ლისპი ერთი ენა არაა, ენების ოჯახია (როგორც მაგ. ინდოევროპულია სალაპარაკო ენებში). ძირითადი დიალექტებია Common Lisp და Scheme. ამ პოსტში ძირითადად Common Lisp-ის, როგორც ყველაზე პრაგმატული ვარიანტის, მაგალითებია მოყვანილი.

4. Abstract syntax tree – ნებისმიერი ენის source code კომპილირებისას გარდაიქმნება AST-დ, და შემდეგ იწყება დალაგება ცვლადების ცალკე, ფუნქციების ცალკე, რომლისთვის უნდა გამოიყოს სტატიკური მეხსიერება და რომლისთვის დინამიური – ცალკე, და ა.შ. ლისპში ეს საფეხური საჭირო არ არის – სორსი უკვე წარმოადგენს ოპერაციის აღწერას და გარდაქმნა არ სჭირდება. ამის სიდიადეს უფრო ის ხალხი დააფასებს, ვისაც კომპილატორების სორს კოდთან შეხება ჰქონია.

5. ლისპი პირველი ენაა, რომელშიც OOP-ს იყენებდნენ (70-80-იანი წლებიდან). ასევე პირველი OOP ენაა, რომელსაც ამის საერთაშორისო სტანდარტი ჰქონდა (ANSI Common Lisp standard, Common Lisp Object System, 1988-1994). Java-ს დღემდე არ აქვს სტანდარტი ;)

6. http://paulgraham.com/reesoo.html

მსოფლიოში ყველაზე მაგარი სიმფონია

- მართლა არ გინდა, გამოგყვე?

არ უპასუხია, ხელით ზურგი მოისინჯა, გარეთ ფეხი გადადგა და სახელურს მოეჭიდა. ხელით სამიდან ერთამდე დაითვალა, კაბინაში მყოფებს გაუღიმა და კორპუსს ხელი კრა.

მაგარი შეგრძნება იყო ვარდნა, მაგრამ უკვე გაჩვეულებრივებოდა. ბოლო დროს მიწის ყურება დაიჩემა. მისჩერებოდა ხოლმე, როგორ უახლოვდებოდა და ის იყო, უნდა ჩახუტებოდა, რომ რგოლს ხელს გამოკრავდა და ჰაერში შეშდებოდა.

ეხლაც უკვე დრო იყო. ხელი ღონივრად მოიქნია. მარჯვენა მხარზე თითქოს ვიღაცამ ძლიერად ჰკრა ხელი. გადმოტრიალდა და მარჯვენა მხრით ქვემოთ დაიწყო ვარდნა. ეტყობა, ძლიერ ბიძგს ვეღარ გაუძლო მარჯვენა ტროსმა.

ეხლა უკვე გაცილებით სწრაფად უახლოვდებოდა მიწას. ხელი ტანზე მიიკრა, გააცოცა და ერთი ჩამოსმით მოხსნა მარცხენა ტროსიც. “არაუშავს, ხდება ხოლმე”, – ფიქრობდა და თან სათადარიგო პარაშუტის სახელურს ეძებდა. ბოლოს დაიხედა.

გაახსენდა, არ დამჭირდებაო, ჩალაგებისას რომ გაიფიქრა. ინანა. მაგრამ რეალობას მალე დაუბრუნდა. არავინ არ გახსენებია, პირველად შეიგრძნო ნამდვილი სიმარტოვე. “ეხლა მსოფლიოში ყველაზე მაგარი სიმფონია რომ დავწერო, ვერავინ გაიგებს”, – გაიფიქრა. რაღაც წაიღიღინა.

მსოფლიოში ყველაზე მაგარი სიმფონია ნამდვილად არ იყო.

ცოტათი გული დაწყდა.

ხმაური

ორი წამით მოწყდი ეკრანს და გაჩერდი. რამე გესმის? თვალები დახუჭე. ტელევიზორის, კომპიუტერის ან ვენტილიატორის ხმა. გამორთე ცოტა ხნით. ეხლა გესმის რამე? გამვლელი მანქანების ხმა. დახურე ფანჯარა. ცოტა ხანი მანქანა არ გაივლის და სიჩუმეა.

Continue reading

ფსიქოდელია თბილისის გარეუბანში

დაბინდებისას უცხოებით სავსე ავტობუსში ვზივარ. სადღაც, გარეუბნის ბოლოს მიტოვებულ შენობასთან ვაჩერებინებ ავტობუსს და ჩამოვდივარ. გარშემო არავინაა. ანგარიშზეც არ მაქვს. სადმე მინდა, რომ ლეპტოპი გავხსნა და მაგთიფანიდან მაინც მივწერო მესიჯი, სად მოვიდე, მარა ქუჩაში არ გამოვა, 15-20 მეტრში, მანქანის უკან, ვიღაც ხუთი ტიპი ორ ტიპს კლავს, სადმე დასაჯდომი ადგილი მინდა. მიტოვებულ შენობას კარი აქვს, მწვანე, მრგვალი EXIT ღილაკით. კარზე დაბეჭდილ თაბახის ფურცელზე დიდი ასოებით წერია: ისარგებლეთ ღილაკით. გარედან აწერია. ალისა much? ვაჭერ ღილაკს, კარი იღება. შევდივარ შენობაში. დიდი, ცარიელი ჰოლია. იატაკზე კედლების ანარეკლი ჩანს. კედლებზე მალდივის და პარიზის სურათებია გაკრული. to the point, ვერაფერს იტყვი. მივდივარ მარცხნივ და დიდ, კომფორტულ სავარძელს ვხედავ. ვჯდები. ღრმად ჩავდივარ სავარძელში. ვაგზავნი მესიჯს და გარშემო ვიყურები. სრული სიცარიელეა, ნეონის ნათურები ციმციმებს, სადღაც ალბათ წყალიც წვეთავს. უცებ ღამურამ გაიფრინა. მერე უკან გამოიფრინა. ჩემთვის არც მოუქცევია ყურადღება, ხელჩასაჭიდი ვერაფერი ვერ დაინახა. ლიფტზე 16 ციმციმებს, არადა 7-სართულიანი შენობაა. ვცდილობ, ჩემი თავი ვიპოვო ამ უცნაურ რეალობაში. აშკარად ფხიზელი ვარ და მღვიძავს. ვიკიდებ.

ღამურამ კიდევ ერთხელ გაიფრინა.

#define LUKA

https://www.youtube.com/watch?v=OirXJUQEzDM&list=PL9wlW2EmGiMhUOj3D015Ydh-k6EKnHQ57

გაფრთხილება: ეს პოსტი განკუთვნილია ისეთი ტიპებისთვის, ვინც ცოდნას და გასხივოსნებას ეძებს. არაუშავს, თუ ეს მკითხველების რაოდენობას 0-მდე დაიყვანს. “აუ კი უნდა ჩავუჯდე მაგას” და “დავიწყებ მაგის გარჩევას” ტიპებს შეუძლიათ ეს პოსტი გათიშონ. ამ გაფრთხილებამ დამაზოგინა დრო იმაზე წუწუნზე, რომ ხალხის უმეტესობა არ ეძებს ჭეშმარიტებას და კომფორტით კმაყოფილდება (regardless of the truth that true comfort lies outside the comfort zone).

დიდი ხანია ტექნოლოგიაზე არ დამიწერია, რადგან ის სამი მკითხველიც არ წაიკითხავს, რომელიც მოთხრობებს კითხულობს ხოლმე. მაგრამ მიწა თავისას მოითხოვს და სანამ დავიბრიდები, იმ მასალების ლინკები მაინც უნდა ჩამოვწერო, რომელმაც ჩემზე გავლენა მოახდინა და საშუალება მომცა, ვინმესთვის რჩევის მიცემის უფლება მქონოდა.

A good mind is always hungry. ლიტერატურის კითხვა როცა შევამცირე, წაკითხული ტექნიკური ლიტერატურის რაოდენობა ცაში ავარდა. ეს იმ პერიოდს (იმპერიოდს ჰეჰ) დაემთხვა, როცა C#-მა თავი იმ დონეზე მომაბეზრა, რომ სამსახურში 3 მონიტორი დავდგი, ერთი ისე შევატრიალე, რომ ვერავის ვერ დაენახა, და მუშაობის მაგივრად Heinlein-ის Stranger in a strange land-ს ვკითხულობდი ხოლმე (და რამდენადაც ოპტიმისტი ვარ, ახალი პროგრამირების ენის ძებნა დავიწყე).

Continue reading

მოლოდინი

ციოდა. ქურთუკში ხელებჩაწყობილი გოგო მობუზული იდგა კუთხეში.

- მალე მოვა? შეიძლება საერთოდაც არ მოვიდეს. მაგრამ მითხრა, მოვალო. არასდროს მოვუტყუებივარ, ალბათ არც ეხლა მომატყუებდა.

მაგრამ თავდაჯერება არ ეტყობოდა.

ქარი ქროდა. ქურთუკში ხელებჩაწყობილ გოგოს ნელნელა მოუთმენლობა ეპარებოდა. ღობიდან გადმოწეულ გვირილას თავი მოსწყვიტა და თვლა დაიწყო.

- მოვა? არ მოვა? მოვა?…

Continue reading

დეზდემონა

ამფითეატრში მოხუცი მაესტრო იჯდა.

სცენაზე მისი მოსწავლე, ქერა, გრძელთმიანი ქალი დეზდემონას თამაშობდა.
ილოცე ძილის წინ, დეზდემონა? მრავალჯერ გამეორებული ფრაზა ჰკითხა მსახიობმა.
დეზდემონა უცებ მივარდა და აკოცა. ოტელომ გულში ჩაიკრა, და როცა მოიშორა, დეზდემონას გულში დანა ჰქონდა გაყრილი.
ამ იმპროვიზაციით უკვე საიუბილეო, მე-100 სპექტაკლს დგამდნენ.

შემდეგ ისევ ნაცნობი სცენა.

ძირს დაცემული დეზდემონა ოდნავ გახელილი თვალებით უყურებდა, როგორ იკლავდა ოტელო თავს.
არ უყვარდა ეს სცენა. ოტელოს ყოველთვის ტომასი თამაშობდა, და ირინას არ უყვარდა
ძირს დავარდნილი, სისხლიანი ტომასის დანახვა.

Continue reading

And then there were none

არის ხოლმე მომენტები, როცა ვიაზრებ, რამდენი რამე მაქვს გასაკეთებელი და არ ვიცი საიდან გავაგრძელო. ეხლაც ერთ-ერთი ეგეთი მომენტია. სამუშაო ცოტა პროზაული თემაა და არ ვთვლი (ხვალ დილამდე დასამთავრებელი სამი პროექტის და იმის მიუხედავად, რომ ბოლოს როდის მეძინა არ მახსოვს). მარტო ისეთ რამეებს ვთვლი, რასაც არ უნდა აკეთებდე რომ გახსოვს და შენ თავს წუთებს რო პარავ რო რამენაირად გააგრძელო კეთება.

Continue reading

და ყველაფერი თავიდან დაიწყო

“მე ცოდვები მანამდე გაპატიეთ, ვიდრე თქვენ მათ ჩაიდენდით.”
იესო ნაზარეთელი

“ძვ. წელთაღრიცხვით 2713 წელს კრიმინალი, როგორც კონცეფცია, მსოფლიო ფედერაციის მთელი შემადგენლობის კანონმდებლობიდან ამოიღეს. ე.წ. “სისხლის სამართლის დანაშაულის” პრეცედენტები, როგორც ასეთი, რამდენიმე წელიწადში ერთხელ თუ ხდებოდა და იშვიათობის გამო მსოფლიო პრესის ყურადღების ცენტრში ექცეოდა. პენიტენციალური სისტემები გამოსასწორებელ ცენტრებად გადაიქცა, რომლებიც საზოგადოებრივი წესრიგის დამრღვევების პიროვნულ გადახალისებას ემსახურებოდა და დარღვევის გამეორების თავიდან აცილებას უზრუნველყოფდა. საგანმანათლებლო სისტემა წინა ათასწლეულთან შედარებით ძირეულად იყო შეცვლილი. მთავარი ყურადღება პიროვნულ განვითარებასა და საზოგადოებაში ინტეგრაციაზე იყო გადატანილი. ფაქტების და ინფორმაციის მაგივრად კონცენტრაცია აზრზე, შინაარსზე და იდეოლოგიაზე ხდებოდა, რითაც ინდივიდუალები აღზრდის პირველივე ეტაპებიდან გარშემომყოფებთან ჰარმონიულ თანაარსებობას, მეცნიერების საფუძვლიან გაგებას და ჰუმანურ სამყაროში ცხოვრებას ეჩვეოდნენ. სამყარო ნამდვილად გაცილებით უკეთესი ადგილი გახდა.”

Continue reading

კოლაფსი

დედოფალმა ხმამაღლა გაიცინა. ყველა ერთხმად აჰყვა. მოსწონდა გაბედული და თავდაჯერებული მეზღვაური, რომელიც წარმოუდგენელი წინადადებით მივიდა მასთან და თან უშიშარი, ცნობისმოყვარე მზერით ათვალიერებდა. სიამოვნებით დაიტოვებდა მის მზეზე გარუჯულ მხრებს ხელის გაწვდენაზე.

მეზღვაური პირდაპირ თვალებში უყურებდა და ორივე სათქმელს თვალებით და მხრების ოდნავი, თითქოს უნებური მოძრაობით ეუბნებოდნენ ერთმანეთს.

- აქ მოსვლა უკვე გმირობის ტოლფასია, მოკვდავო, – დამარცვლით წარმოთქვა დედოფალმა, – ჩემთვის თვალებში შეხედვაც კი არ შეგეშინდა, არადა კარგად იცი, რა გელის, რომ გავახილო. ღმერთების სისხლიც ხომ არ ურევია შენში?

Continue reading