Многострочные шебанги в Clojure?

Цель: создать сценарий Clojure, который запускается -main при запуске от имени ./script.clj.

Самое близкое, что я получил, это

#!/bin/bash
#(comment
exec clj -m `basename $0 .clj` ${1+"$@"}
exit
#)
(defn -main [args]
   (println args))

Но Clojure не позволяет коду, отличному от Lisp, внутри многострочных комментариев, а Clojure не имеет синтаксиса Common Lisps #| ... |#.


person mcandre    schedule 08.03.2011    source источник
comment
Из любопытства, почему #!/usr/bin/clj -m не работает?   -  person sarnold    schedule 08.03.2011
comment
Все еще не вижу, чем это отличается от вашего недавнего вопроса stackoverflow.com/questions/5224548/, которое само по себе было дубликатом stackoverflow.com/questions/973106/. Есть ли что-то в очень обстоятельном ответе Брайана, что вас не устраивает?   -  person amalloy    schedule 08.03.2011
comment
Во-первых, ответ Брайана — это полное отсутствие ответа. То, что что-то не идиоматично, не означает, что этого следует избегать. Во-вторых, Брайан ничего не говорит о многострочных шебангах.   -  person mcandre    schedule 08.03.2011
comment
На самом деле, если что-то не идиоматично, есть две возможности. Первая возможность заключается в том, что вы неизвестный гений, который обнаружил что-то совершенно новое и важное, что изменит представление людей о программировании на этом языке. Во-вторых, вы упустили то или иное ключевое понятие и делаете вещи, которые контрпродуктивны или еще хуже. Я оставлю это вам, чтобы угадать, какой из этих двух более вероятен.   -  person JUST MY correct OPINION    schedule 08.03.2011
comment
Шебанги не новы, но они полезны для написания программ с интерфейсами командной строки.   -  person mcandre    schedule 28.03.2011
comment
@sarnold: вы на правильном пути, но синтаксис basename, exec и кавычка-двоеточие-кавычка-точка с запятой необходим для сценариев, которых нет в пути к классам. Мне не нравится устанавливать путь к классам для каждого маленького сценария, который я пишу.   -  person mcandre    schedule 28.03.2011


Ответы (2)


Синтаксис неясен, но работает. Из Викиучебников.

$ ./hello.clj Fred
Hello Fred!

":";exec clj -m `basename $0 .clj` ${1+"$@"}
":";exit

(ns hello
    (:gen-class))

(defn -main
    [greetee]
    (println (str "Hello " greetee "!")))
person mcandre    schedule 08.03.2011
comment
Я удивлен, что авторы Clojure не приложили больше усилий, чтобы скрипты Clojure подходили лучше. - person sarnold; 28.03.2011
comment
Сообщество Clojure настроено против POSIX. Как мне шебанг? Не надо; Используйте клж. Как вручную скомпилировать? Не надо; использовать Лейнинген. - person mcandre; 30.03.2011

Поскольку Clojure CLI стал доступен, используйте

#! /usr/bin/env clj

(println "Hello World!")
person Aleksei Sotnikov    schedule 22.02.2018