схема chez — загрузка совместно используемого объекта на основе платформы

#scheme #chez-scheme

#схема #схема chez

Вопрос:

Библиотека OpenGL для схемы Chez (в настоящее время настроена только для Linux) загружает библиотеку GLUT следующим образом:

 (define no-op (load-shared-object "libglut.so.3"))
  

Вот ссылка на этот код.

Конечно, мы хотели бы, чтобы библиотека загружалась libglut.so.3 на Linux, но GLUT.framework/GLUT на macOS.

Вот пример того, как схема Ypsilon загружает библиотеки на основе платформы:

 (define libGLUT
  (cond
    (on-darwin  (load-shared-object "GLUT.framework/GLUT"))
    (on-windows (load-shared-object "glut32.dll"))
    (on-linux   (load-shared-object "libglut.so.3"))
    (on-freebsd (load-shared-object "libglut.so"))
    (on-openbsd (begin
             (load-shared-object "libXmu.so.10.0")
             (load-shared-object "libGLU.so.7.0")
             (load-shared-object "libglut.so.3.7")))
    (else
     (assertion-violation
      #f
          "can not locate GLUT library, unknown operating system"))))
  

Какой хороший способ проверить платформу на схеме Chez, чтобы мы могли сделать что-то подобное в наших привязках для иностранных библиотек?

Ответ №1:

Из https://github.com/cisco/ChezScheme/blob/master/examples/socket.ss:

 (case (machine-type)
  [(i3le ti3le) (load-shared-object "libc.so.6")]
  [(i3osx ti3osx a6osx ta6osx) (load-shared-object "libc.dylib")]
  [else (load-shared-object "libc.so")])
  

Использование meta-cond вместо этого даст вам немного более эффективное поведение во время выполнения, поскольку оно будет разрешено во время компиляции.

Ответ №2:

Как насчет (machine-type) ?

 ~ % uname -m -p -r -s
Darwin 15.6.0 x86_64 i386
~ % chez
Chez Scheme Version 9.4.1
Copyright 1984-2016 Cisco Systems, Inc.

> (machine-type)
ta6osx