let interpret_ident = fun s -> fun input_beam ->
        let n = List.length input_beam in
        match s with
        |Pass -> if n = 1 then input_beam else raise (Evaluation_Error "Ident _")

        |Stop -> if n = 1 then [] else raise (Evaluation_Error "Ident !")

        |Add -> if n = 2 then [signal_add (List.nth input_beam 0) (List.nth input_beam 1)] 
                        else raise (Evaluation_Error "Ident +")

        |Sup -> if n = 2 then [signal_sub (List.nth input_beam 0) (List.nth input_beam 1)] 
                        else raise (Evaluation_Error "Ident -")

        |Mul -> if n = 2 then [signal_mul (List.nth input_beam 0) (List.nth input_beam 1)] 
                        else raise (Evaluation_Error "Ident *")

        |Div -> if n = 2 then [signal_div (List.nth input_beam 0) (List.nth input_beam 1)] 
                        else raise (Evaluation_Error "Ident /")

        |Delay -> if n = 2 then [signal_delay (List.nth input_beam 0) (List.nth input_beam 1)] 
                        else raise (Evaluation_Error "Ident @")

        |Mem -> if n = 1 then [signal_mem (List.nth input_beam 0)] 
                        else raise (Evaluation_Error "Ident mem")

        |Vectorize -> if n = 2 then [signal_vectorize (List.nth input_beam 0) (List.nth input_beam 1)]
                        else raise (Evaluation_Error "Ident vectorize")

        |Serialize -> if n = 1 then [signal_serialize (List.nth input_beam 0)]
                        else raise (Evaluation_Error "Ident serialize")

        |Concat -> if n = 2 then [signal_append (List.nth input_beam 0) (List.nth input_beam 1)]
                        else raise (Evaluation_Error "Ident #")

        |Nth -> if n = 2 then [signal_nth (List.nth input_beam 0) (List.nth input_beam 1)]
                        else raise (Evaluation_Error "Ident []")

        |Floor -> if n = 1 then [signal_floor (List.nth input_beam 0)]
                        else raise (Evaluation_Error "Ident floor")

        |Int -> if n = 1 then [signal_int (List.nth input_beam 0)]
                        else raise (Evaluation_Error "Ident int")

        |Sin -> if n = 1 then [signal_sin (List.nth input_beam 0)]
                        else raise (Evaluation_Error "Ident sin")

        |Cos -> if n = 1 then [signal_cos (List.nth input_beam 0)]
                        else raise (Evaluation_Error "Ident cos")

        |Atan -> if n = 1 then [signal_atan (List.nth input_beam 0)]
                        else raise (Evaluation_Error "Ident atan")

        |Atantwo -> if n = 2 then [signal_atantwo (List.nth input_beam 0) (List.nth input_beam 1)]
                        else raise (Evaluation_Error "Ident atantwo")

        |Sqrt -> if n = 1 then [signal_sqrt (List.nth input_beam 0)]
                        else raise (Evaluation_Error "Ident sqrt")

        |Rdtable -> if n = 3 then [signal_rdtable (List.nth input_beam 0) 
                                        (List.nth input_beam 1) (List.nth input_beam 2)] 
                        else raise (Evaluation_Error "Ident rdtable")

        |Selecttwo -> if n = 3 then [signal_select2 (List.nth input_beam 0) (List.nth input_beam 1) 
                                        (List.nth input_beam 2)] 
                        else raise (Evaluation_Error "Ident select2")

        |Selectthree -> if n = 4 then [signal_select3 (List.nth input_beam 0) (List.nth input_beam 1) 
                                        (List.nth input_beam 2) (List.nth input_beam 3)] 
                        else raise (Evaluation_Error "Ident select3")

        |Prefix -> if n = 2 then [signal_prefix (List.nth input_beam 0) (List.nth input_beam 1)] 
                        else raise (Evaluation_Error "Ident prefix")

        |Mod -> if n = 2 then [signal_mod (List.nth input_beam 0) (List.nth input_beam 1)] 
                        else raise (Evaluation_Error "Ident %")

        |Larger -> if n = 2 then [signal_sup (List.nth input_beam 0) (List.nth input_beam 1)] 
                        else raise (Evaluation_Error "Ident >")

        |Smaller -> if n = 2 then [signal_inf (List.nth input_beam 0) (List.nth input_beam 1)] 
                else raise (Evaluation_Error "Ident <")