24/07/06 22:03:11.80 pcJPW2j0N
{% macro evaluate(expression) %}
{% set result = _self._evaluate(expression|trim) %}{{ result }}
{% endmacro %}
{% macro _evaluate(expression) %}
{% set num = 1 %}
{# 前後の空白を取り除く #}{% set expr = expression|trim %}
{# カッコで挟まれた部分を識別する #}{% if expr starts with '(' and expr ends with ')' %}
{# 文字の部分だけをexprに代入 #}{% set expr = expr|slice(1, -1)|trim %}
{% endif %}
{# 空白で配列化 #}{% set components = expr|split(' ') %}
{# 配列の1番目の記号で計算式を判別し #}{% set operator = components[0] %}
{# 配列の2番目の番目以降の数字で配列を作る #}
{% set operands = components[1:] %}
{% if operator == '+' %}
{% set result = operands|reduce((acc, item) => acc + item|number_format) %}
{% elseif operator == '-' %}
{% for item in operands %}{% if num == 1 %}{% set totalPrice = item|number_format %}
{% set num = num + 1 %}{% else %}{% set num = num + 1 %}{% set totalPrice = totalPrice - item|number_format %}
{% endif %}{% if num == operands|length + 1 %}{{ totalPrice }}{% endif %}{% endfor %}
{% elseif operator == '*' %}
{% set result = operands|reduce((acc, item) => acc * item|number_format,1) %}
{% elseif operator == '/' %}{% for item in operands %}{% if num == 1 %}{% set totalPrice = item|number_format %}{% set num = num + 1 %}
{% else %}{% set num = num + 1 %}{% set totalPrice = totalPrice / item|number_format %}
{% endif %}{% if num == operands|length + 1 %}{{ totalPrice }}{% endif %}{% endfor %}
{% else %}{% set result = "Unknown operation" %}{% endif %}{{ result }}{% endmacro %}
{# Usage examples #}
{{ _self.evaluate("(+ 1 2 3)") }} {# Output: 6 #}
{{ _self.evaluate("(* 2 3 4)") }} {# Output: 24 #}
{{ _self.evaluate("(- 10 3)") }} {# Output: 7 #}
{{ _self.evaluate("(/ 15 3)") }} {# Output: 5 #}