Запуск файла .clj Clojure с Leiningen - PullRequest
0 голосов
/ 27 октября 2019

Я недавно начал изучать Clojure, и мне было интересно, существует ли стандартный способ выполнения простого файла .clj.

Я установил Leiningen и создал свой первый проект под названием my-stuff используя lein новое приложение my-stuff .

Чтобы запустить my-stuff.core , я начал с lein run :

user>lein run
Hello, World!

Затем я попытался lein repl , затем:

user=> (require 'my-stuff.core)
nil
user=> (my-stuff.core/-main)
Hello, World!
nil 

Я также использовал lein repl , чтобы выполнить некоторые базовые оценки:

user=> (defn sum [x y] (+ x y))
#'user/sum
user=> (sum 1 2)
3

Я пытался определить эту функцию в my-stuff.core :

(ns my-stuff.core ((:gen-class))

(defn sum [x y] (+ x y))

(defn -main
  [& args]
  (sum [1 2]))

Я получаю следующую ошибку: clojure.lang.ArityException: Неверное числоargs (1) передано в: my-stuff.core / sum

Я прошу прощения, если это глупый вопрос, но как бы я правильно определил эту функцию в core.clj ? Имеет ли смысл определять его в отдельном файле и ссылаться на него из файла core.clj ?

Спасибо.

Обновление

Если функция была определена в другом файле .clj Clojure, как правильно объявить пространство имен, чтобы можно было запускать код из проекта my-stuff?

Ответы [ 2 ]

1 голос
/ 27 октября 2019

Могу поспорить, что есть способы использовать Leiningen для создания автономного файла .clj, но я не знаю, что это такое.

Я знаю способ создания автономного файла, который представляет собой комбинациюкак bash-скрипта, так и clj-файла, который является исполняемым и работает до тех пор, пока в системе установлены Java и инструменты CLI CLI - https://clojure.org/guides/getting_started

Он также позволяет указывать зависимости в том же файле, что иисходный код Clojure, даже если эти зависимости не включены как часть самого Clojure.

Вот пример: https://github.com/jafingerhut/dotfiles/blob/master/bin/clj-check-added-metadata

0 голосов
/ 27 октября 2019

Глупых вопросов нет! : -)

Давайте проверим определенную вами функцию:

(defn sum [x y] (+ x y))

Эта функция принимает два аргумента, x и y. В Clojure параметры функции заключены в квадратные скобки, потому что это помогает удобочитаемости.

Давайте проверим, как вы вызываете функцию:

  (sum [1 2])

Здесь вы вызываете функцию sum простоодин аргумент, вектор [1 2], который похож на массив из 2 элементов. Ошибка пытается сообщить вам: вы вызываете функцию, которая принимает два аргумента, но вы указали только один . В этом случае вы исправите ошибку следующим образом:

  (sum 1 2)

Редактировать : если вы создаете новое пространство имен в своем проекте, например:

src
└── myapp
    ├── core.clj
    └── utils.clj

Вы можете вызывать функции из другого пространства имен, используя инструкцию :require в объявлении ns вверху.

Допустим, у меня есть эта функция в utils.clj:

(ns myapp.utils)

(defn sum [a b]
  (+ a b))

Затем вы можете позвонить sum из пространства имен core следующим образом:

(ns myapp.core
  (:require [myapp.utils :refer [sum]]))

(defn -main
  [& args]
  (sum 1 2)) ;; call `sum` defined in the `myapp.utils` namespace
...