That's a very beautiful solution.
Thank you! 

On Tuesday, April 26, 2016 at 10:58:39 PM UTC+2, Josh Langsfeld wrote:

> eval works in global scope but returns its result locally, so something 
> like this works easily enough:
>
> rulestrs = ["x[1] && x[2]", "x[3] || x[4]", "x[1] && (x[2] || x[3])"]
>
> function evaluate(rules, boolList)
>   rulefuncs = [eval(parse(string("x -> ", rule))) for rule in rules]
>   Bool[rf(boolList) for rf in rulefuncs]
> end
>
> evaluate(rulestrs, [true, false, true, false])  #output: Array{Bool,1} - 
> [false, 
> true, true]
>
> Note the the Bool is required for the comprehension to get the correct 
> output type because the compiler has no idea that all the anonymous 
> functions return Bools.
>
> On Tuesday, April 26, 2016 at 2:24:18 PM UTC-4, Ali Rezaee wrote:
>>
>> Reading the rules from a file, how can I convert the strings to such 
>> anonymous functions?
>>
>> On Tuesday, April 26, 2016 at 6:48:21 PM UTC+2, Josh Langsfeld wrote:
>>>
>>> Maybe a better design would be to store the rules as anonymous functions 
>>> rather than code strings? Something like:
>>>
>>> ```
>>> rules = [(x -> x[1] && x[2]), (x -> x[3] || x[4])] #parentheses not 
>>> required
>>> result = [rule(boolList) for rule in rules]
>>> ```
>>>
>>> On Tuesday, April 26, 2016 at 12:09:33 PM UTC-4, Ali Rezaee wrote:
>>>>
>>>>
>>>> Thanks for your replies.
>>>> My objective is exactly what the code shows. I have a list of Boolean 
>>>> expressions similar to the examples in the code, and I need to evaluate 
>>>> them one by one based on x values.
>>>> So writing a macro would be the only solution.
>>>>
>>>> Best regards
>>>> On Tuesday, April 26, 2016 at 5:38:21 PM UTC+2, Ali Rezaee wrote:
>>>>
>>>>> Hi everyone,
>>>>>
>>>>> I am trying to run the code below. When I try the code outside of a 
>>>>> function and in REPL, it runs successfully. However when I run it using a 
>>>>> function it throw an error.
>>>>> Why do I get the error? and how can I solve this problem?
>>>>>
>>>>> Thanks in advance for your help.
>>>>>
>>>>> rules = ["(x[1] && x[2])", "(x[3] || x[4])"]; # a list of boolean 
>>>>> expressions
>>>>> boolList = [false, true, false, true]; # a boolean vector for every x 
>>>>> in rules
>>>>>
>>>>> function evaluate(rules, boolList)
>>>>>   x = boolList
>>>>>   result = Array{Bool}(length(rules))
>>>>>   for (i, rule) in enumerate(rules)
>>>>>     result[i] = eval(parse(rule))
>>>>>   end
>>>>>   return result
>>>>> end
>>>>>
>>>>> evaluate(rules, boolList)
>>>>> # ERROR: UndefVarError: x not defined
>>>>>
>>>>> # but This will work:
>>>>> x = boolList
>>>>> result = Array{Bool}(length(rules))
>>>>> for (i, rule) in enumerate(rules)
>>>>>   result[i] = eval(parse(rule))
>>>>> end
>>>>>
>>>>> result
>>>>> # 2-element Array{Bool,1}: false true
>>>>>
>>>>>
>>>>>

Reply via email to