2015-02-10 4 views
14

Posso definire le funzioni con nome nei moduli, ma non ho ancora imparato a usarlo nelle console iex> o ex>.Come posso definire le funzioni con nome nella console di Elixir senza ottenere ** (ArgumentError) non può richiamare def/2 all'esterno del modulo?

Continuo a ricevere il seguente errore quando si tenta di eseguire il comando DEF:

(ArgumentError) cannot invoke def/2 outside module 

pprime.exs

IO.puts "initial division test" 

defmodule Expand do 
    def transform(myvar) do 
     8 * myvar + 3; 
    end 
end 

div2 = fn inputnum -> 
    [:a, inputnum/2.0, inputnum/3, inputnum/5.0, inputnum/7] 
end 

output = div2.(20.1) 

posso correre questo con elisir bene, come segue:

$ elixir pprime.exs 

Tuttavia, nella console, non riesco a fare nulla del genere:

Erlang/OTP 17 [erts-6.3] [source] [64-bit] [async-threads:10] [kernel-poll:false] 

Interactive Elixir (1.0.2) - press Ctrl+C to exit (type h() ENTER for help) 
iex(1)> def transform(myvar) do 8 * myvar + 3; end 
** (ArgumentError) cannot invoke def/2 outside module 
    (elixir) lib/kernel.ex:3556: Kernel.assert_module_scope/3 
    (elixir) lib/kernel.ex:2816: Kernel.define/4 
    (elixir) expanding macro: Kernel.def/2 
    (elixir) iex:1: :elixir_compiler.__FILE__/2 

Come definire una funzione con nome nella console Elixir?

È possibile?

Devo creare un modulo speciale da utilizzare nella console Elixir?

risposta

13

Risposta breve: non è possibile.

Risposta lunga: tutti i codici in elisir esistono all'interno dei moduli poiché molte funzioni di Elixir, come lo scambio di codice, si basano sull'avere moduli come contenitore del codice. Ecco perché non è possibile definire funzioni al di fuori dei moduli (non esiste uno spazio dei nomi globale e mutevole a cui possano essere aggiunti).

+1

È possibile aggiungere un modulo per la console Elixir per definire una funzione? –

+4

Sì, puoi semplicemente nidificare il 'def' in un' defmodule', proprio come nel file exs. –

+0

//, sento l'odore debole e umido dei capelli di yak, ma non tutte le lingue possono o dovrebbero essere Python, immagino. –

14

È possibile definire il modulo in iex. Copia e incolla funziona bene:

iex(1)> defmodule Expand do 
...(1)>  def transform(myvar) do 
...(1)>   8 * myvar + 3; 
...(1)>  end 
...(1)> end 
iex(2)> Expand.transform(12) 
99 
iex(3)> defmodule Expand do 
...(3)>  def transform(myvar) do 
...(3)>   3 * myvar + 5 
...(3)>  end 
...(3)> end 
iex:3: warning: redefining module Expand 
iex(4)> Expand.transform(12) 
41 
+4

Oppure, se non si desidera definire l'intero modulo, è possibile utilizzare le funzioni anonime: 'transform = fn (myvar) -> 8 * myvar + 3 end' e quindi' transform. (5) ' – tkowal

Problemi correlati