Current section

Files

Jump to
lfe src lfe_init.erl
Raw

src/lfe_init.erl

%% Copyright (c) 2008-2014 Robert Virding
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
%% You may obtain a copy of the License at
%%
%% http://www.apache.org/licenses/LICENSE-2.0
%%
%% Unless required by applicable law or agreed to in writing, software
%% distributed under the License is distributed on an "AS IS" BASIS,
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
%% See the License for the specific language governing permissions and
%% limitations under the License.
%%% File : lfe_init.erl
%%% Author : Robert Virding
%%% Purpose : Lisp Flavoured Erlang init module.
%%% This little beauty allows you to start Erlang with the LFE shell
%%% running and still has ^G and user_drv enabled. Use it as follows:
%%%
%%% erl -user lfe_init
%%%
%%% Add -pa to find modules if necessary.
%%%
%%% Thanks to Attila Babo for showing me how to do this.
-module(lfe_init).
-export([start/0]).
-define(OK_STATUS, 0).
-define(ERROR_STATUS, 127).
%% Start LFE running a script or the shell depending on arguments.
start() ->
case init:get_plain_arguments() of
["-lfe_eval"|As] -> %Run a command string
user:start(), %Start user for io
run_string(As);
[S|As] -> %Run a script
user:start(), %Start user for io
run_file([S|As]);
[] -> %Run a shell
user_drv:start(['tty_sl -c -e',{lfe_shell,start,[]}])
end.
run_file([S|As]) ->
Script = fun () -> lfe_shell:run_script(S, As) end,
spawn_link(fun () -> run_script(Script) end).
run_string([]) -> run_string([], []); %No command
run_string(["--"]) -> run_string([], []); %No command
run_string([S,"--"|As]) -> run_string(S, As);
run_string([S|As]) -> run_string(S, As).
run_string([], _) -> %No command
io:put_chars(user, "eval: missing command\n"),
halt(?ERROR_STATUS);
run_string(S, As) ->
Script = fun () -> lfe_shell:run_string(S, As) end,
spawn_link(fun () -> run_script(Script) end).
run_script(Script) ->
try
Script(),
init:stop(?OK_STATUS)
catch
Class:Error ->
St = erlang:get_stacktrace(), %Need to get this first
Sf = fun (_) -> false end,
Ff = fun (T, I) -> lfe_io:prettyprint1(T, 15, I, 80) end,
Cs = lfe_lib:format_exception(Class, Error, St, Sf, Ff, 1),
io:put_chars(Cs),
halt(?ERROR_STATUS)
end.