LINUX.ORG.RU

Навелосипедил квадратные скобки в лиспе

 , , ,


1

4

Тащемто, для полного счастья в bike, кроме прочего, не хватало ридер-макросов, которые бы уменьшали количество круглых скобок, квотирования и прочего текста при вызове дотнета.

Тащемто теперь есть. Вот так можно вызывать методы:

(use-namespace 'System)

[:Console WriteLine "Hello, World!"]

Вот так можно получить текущее время в стринге: (ни одной круглой скобки! может это tcl/tk?)

[[:DateTime %Now] ToString]

А вот так получить значение максимального int32, из специального статического поля соответствующего класса:

[:int $MaxValue]

Более того, можно стучаться в индексеры дикшнрей и прочих объектов, даже круче чем в Clojure:

(let ((dict (new '(Dictionary :string :string))))
  (setf #[dict "Hello"] "World!")
  dict)

И создавать Enum-ы не обременяя себя расставлением запятых:

(use-namespace 'System.Reflection)

#e(BindingFlags Public Static)

На закуску, для любителей ковыряться в байтах, добавил и такую возможность, прямо как в C# только лучше:

(use-namespace 'System.Text)

(let ((dotnet-array [[:Encoding %UTF8] GetBytes "Hello, World!"]))
  (with-fixed (raw-pointer dotnet-array)
   (cffi:mem-ref raw-pointer :uint8)))
;; ==> 72

Не хватает батареек? Тогда мы идем к вам!

★★★

Лиспером себя считает, а про M-выражения не в курсе.

anonymous
()

Прочитал «навелосипедил квадратные колёса». В чём достижение-то? Квадратные скобки тривиально делаются, прямо в cltl2 пример, как сделать. И к тому же здесь ты пишешь, как здорово избавился от чрезмерного количества круглых скобок, а в другом месте говоришь, что кложуристы страдают скобкофобией. Непоследовательно как-то.

den73 ★★★★★
()

А как в этом велосипеде происходит интероп между рантаймами (имеющими разную природу), в плане что видит в лишпе дотнет.кор? Ну например если из конструкции вызова статического метода какого-нибудь класса будет обращение к лишповым данным. Ну и наобородт.

anonymous
()
Ответ на: комментарий от anonymous

В основе интеропа - способность дотнета вызывать/вызываться используя сишное ABI.

Лисповые примитивы маршалятся в дотнетовские. Сложные лисповые объекты .Net видит как некоторый LispObject являющийся лисповым аналогом GCHandle: https://github.com/Lovesan/bike/blob/master/src/BikeInterop/LispObject.cs

И наоборот: https://github.com/Lovesan/bike/blob/master/src/object.lisp

Собственно GCHandle используется для передачи дотнет-объектов в лисп.

Вызов дотнет-методов итп происходит либо через рефлекшн, либо с помощью хитрых компилируемых в рантайме и потом кешируемых трамплинов. Вызов лиспа из дотнета также происходит с помощью коллбеков-трамплинов.

lovesan ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.