Pull to refresh

Comments 11

но в отличие от Java или Python, у меня на машине есть исходный код SBCL

Я правильно понимаю, что у автора на машине нет исходного кода Java или Python?
Они были им специально удалены или как такое получилось?

Если же речь идет о методах и классах, которые реализуются для каждой платформы отдельно и поставляются через линкеры, то разве в Lisp не так же?
Тут имеется ввиду что с помощью SLIME можно перемещаться по исходному коду самого SBCL, в принципе IDE для джавы тоже умеют перемещаться по ее коду, другое дело что SBCL, например, сам написан на коммон лиспе поэтому перемещаться можно куда угодно)

>Если же речь идет о методах и классах, которые реализуются для каждой платформы отдельно и поставляются через линкеры, то разве в Lisp не так же?

Не совсем понял, какие методы и классы для каждой платформы?
Спасибо большое за пояснения.

>Не совсем понял, какие методы и классы для каждой платформы?

Я имел ввиду реализацию того, что требует низкоуровнего доступа или того, что было отдано на откуп компилятору/интерпретатору.

Как, например, native методы в Java (из класса System):
 public static native void arraycopy(Object src,  int  srcPos,
                                        Object dest, int destPos,
                                        int length);


Или пустышки в Python (из класса float):

def conjugate(self, *args, **kwargs): # real signature unknown
        """ Return self, the complex conjugate of any float. """
        pass
Это реализуется в коммон лиспе с помощью так называемых readtime conditionals. Говоря простым языком — есть глобальный список *features* в котором хранятся названия фич присутствующих в текущем окружении, на которые может полагаться код. Во время чтения кода программы ридер обращает внимание на макросы чтения #+ и #-, которые соответственно определяют условия наличия или отсутствия нужных фич.

Вот отличный пример, в библиотеке Babel: github.com/cl-babel/babel/blob/master/src/strings.lisp#L138 тут после объявления макроса и сточки документации идет код, специфичный для разных реализаций лиспа, типа
#+sbcl
 `(sb-kernel:with-array-data ((,v ,vector) (,s ,start) (,e ,end))
    ,@body)
#+(or cmu scl)
  `(lisp::with-array-data ((,v ,vector) (,s ,start) (,e ,end))
     ,@body)
#-(or sbcl cmu scl openmcl allegro) ...

То есть, в этом примере, если у нас в *features* нет :SBCL, то форма идущая за первым условием просто будет пропущена во время чтения и не создаст каких-либо проверок и оверхеда в рантайме.
Эти флаги (sbcl, cmu, scl и тд) как раз находятся в списке *features* и изначально добавляются туда реализацией. Так же видно, что их можно комбинировать различными способами.
Библиотеки так же добавляют собственные флаги, таким образом, код других библиотек или код пользователя может так же опираться на их наличие или отсутствие.

Вот например список флагов в SBCL 1.1.14 на моей машине без каких-либо библиотек:
* *features*

(:ALIEN-CALLBACKS :ANSI-CL :ASH-RIGHT-VOPS :C-STACK-IS-CONTROL-STACK
 :COMMON-LISP :COMPARE-AND-SWAP-VOPS :COMPLEX-FLOAT-VOPS :CYCLE-COUNTER :ELF
 :FLOAT-EQL-VOPS :GENCGC :IEEE-FLOATING-POINT :INLINE-CONSTANTS :LARGEFILE
 :LINKAGE-TABLE :LINUX :LITTLE-ENDIAN :MEMORY-BARRIER-VOPS :MULTIPLY-HIGH-VOPS
 :OS-PROVIDES-BLKSIZE-T :OS-PROVIDES-DLADDR :OS-PROVIDES-DLOPEN
 :OS-PROVIDES-GETPROTOBY-R :OS-PROVIDES-POLL :OS-PROVIDES-PUTWC
 :OS-PROVIDES-SUSECONDS-T :PACKAGE-LOCAL-NICKNAMES :RAW-INSTANCE-INIT-VOPS
 :SB-CORE-COMPRESSION :SB-DOC :SB-EVAL :SB-FUTEX :SB-LDB :SB-PACKAGE-LOCKS
 :SB-SIMD-PACK :SB-SOURCE-LOCATIONS :SB-TEST :SB-THREAD :SB-UNICODE :SBCL
 :STACK-ALLOCATABLE-CLOSURES :STACK-ALLOCATABLE-FIXED-OBJECTS
 :STACK-ALLOCATABLE-LISTS :STACK-ALLOCATABLE-VECTORS
 :STACK-GROWS-DOWNWARD-NOT-UPWARD :UNIX :UNWIND-TO-FRAME-AND-CALL-VOP :X86-64)


Из самых общих видно :LINUX, :UNIX, :X86_64, :LITTLE-ENDIAN — по ним библиотеки процессов/потоков, работы с сетью, файлами, вобщем всем платформо-зависимым определяют на что они могут расчитывать, какие системные вызовы использовать, как передавать аргументы в нативный код и тд.

Это дает возможность (и пользователи коммон лиспа во всю этим пользуются) писать максимально платформо-независимый код, при этом используя все возможности конкретной платформы, не подгоняя их под какой-то общий минимум.
UFO just landed and posted this here
Частично, в комментариях к оригинальному посту есть обсуждение clojure в данном контексте. Например, там обсуждается что в Common Lisp возможности интроспекции намного лучше и вобще он более динамичный (например пакеты лучше чем неймспейсы), CLOS отличная объектная система, система сигналов так же очень мощная и полезная, есть доступ к ридер-макросам, и язык не привязан к окружающей платформе (в смысле ограничений которые переносятся в язык).

Так же там есть комментарии по поводу TRACE в clojure, у которой есть определенные ограничения.
UFO just landed and posted this here
В переводах внизу генерируется строчка с авторами, там ссылка.
А, точно. Спасибо, буду знать!
Показалось, Зерт подсаживает людей на эрланги и лиспы :)
Sign up to leave a comment.

Articles