2ちゃんねる ■掲示板に戻る■ 全部 1- 最新50    

Twigでlispを作ってるんだナ!

1 :デフォルトの名無しさん:2024/07/06(土) 22:03:11.80 ID: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 #}

2 :デフォルトの名無しさん:2024/07/07(日) 12:07:25.52 ID:Z9WWCnLov
{% macro evaluate(expression) %}{% set result = _self._evaluate(expression|trim) %}{{ result }}{% endmacro %}
{% macro _evaluate(expression) %}{% set num = 1 %}
{% set expr = expression|trim %}{% set expr = expr|split(')(') %}{% set expra = expr[0] %}
{% set expra = expra|trim('(')|trim(')')|trim %}{% set components = expra|split(' ') %}
{% set operator = components[0] %}{% set operands = components[1:] %}
{% if operator == '+' %}{{_self._keisan(operator,operands)}}
{% elseif operator == '-' %}{{_self._keisan(operator,operands)}}{% elseif operator == '*' %}{{_self._keisan(operator,operands)}}
{% elseif operator == '/' %}{{_self._keisan(operator,operands)}}{% elseif operator == 'if' %}{% set a = operands[0]|trim('(') %}
{% set b = operands[1] %}{% set c = operands[2]|trim(')') %}{% if a == 'eq?' %}{% if b == c %}{% set result = "true" %}
{% set expra = expr[1] %}{% set expra = expra|trim('(')|trim(')')|trim %}{% set components = expra|split(' ') %}
{% set operator = components[0] %}{% set operands = components[1:] %}
{{_self._keisan(operator,operands)}}{% else %}
{% set result = "false" %}{% endif %}{% elseif a == 'neq?' %}{% if b != c %}{% set result = "true" %}
{% set expra = expr[1] %}{% set expra = expra|trim('(')|trim(')')|trim %}{% set components = expra|split(' ') %}
{% set operator = components[0] %}{% set operands = components[1:] %}{{_self._keisan(operator,operands)}}
{% else %}{% set result = "false" %}{% endif %}{% endif %}{% else %}{% set result = "Unknown operation" %}
{% endif %}{{ result }}{% endmacro %}

3 :デフォルトの名無しさん:2024/07/07(日) 12:07:56.87 ID:Z9WWCnLov
{% macro _keisan(operator,operands) %}{% set num = 1 %}
{% if operator == '+' %}{% set result = operands|reduce((acc, item) => acc + item|number_format) %}{{result}}
{% 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) %}{{ result }}
{% 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 %}{% endif %}{% endmacro %}
{{ _self.evaluate("(+ 1 2 6)") }}{{ _self.evaluate("(* 2 3 2)") }}
{{ _self.evaluate("(- 10 3 2)") }} {{ _self.evaluate("(/ 15 3)") }}
{{ _self.evaluate("(if (eq? 3 3))(+ 1 2 6)") }}{{ _self.evaluate("(if (neq? 3 1))(+ 1 2 6)") }}

4 :デフォルトの名無しさん:2024/07/07(日) 18:00:20.91 ID:Z9WWCnLov
{% macro evaluate(expression) %}{% set result = _self._evaluate(expression|trim) %}{{ result }} {% endmacro %}
{% macro _evaluate(expression) %}{% set num = 1 %}{% set i = 0 %}{% set expr = expression|trim %}{% set expr = expr|split(')(') %}
{% set expra = expr[0] %}{% set expra = expra|trim('(')|trim(')')|trim %}{% set components = expra|split(' ') %}
{% set operator = components[0] %}{% set operands = components[1:] %}{% if operator == '+' %}{{_self._keisan(operator,operands)}}
{% elseif operator == '-' %}{{_self._keisan(operator,operands)}} {% elseif operator == '*' %}{{_self._keisan(operator,operands)}}
{% elseif operator == '/' %}{{_self._keisan(operator,operands)}} {% elseif operator == 'print' %}{{_self._keisan(operator,operands)}}
{% elseif operator == 'for' %}{% set a = operands[0]|trim('(') %}
{% set b = operands[1]|trim(')') %}{% if a == "range" and i < b|number_format %}{% for i in 1..b %}{% set expra = expr[1] %}
{% set expra = expra|trim('(')|trim(')')|trim %}{% set components = expra|split(' ') %}{% set operator = components[0] %}
{% set operands = components[1:] %}{{_self._keisan(operator,operands)}} {% set i = i + 1 %}{% endfor %}{% endif %}
{% elseif operator == 'if' %}{% set a = operands[0]|trim('(') %}{% set b = operands[1] %}{% set c = operands[2]|trim(')') %}
{% if a == 'eq?' %}{% if b == c %}{% set result = "true" %}{% set expra = expr[1] %}{% set expra = expra|trim('(')|trim(')')|trim %}
{% set components = expra|split(' ') %}{% set operator = components[0] %}{% set operands = components[1:] %}{{_self._keisan(operator,operands)}}

5 :デフォルトの名無しさん:2024/07/07(日) 18:01:55.50 ID:Z9WWCnLov
{% else %}{% set result = "false" %}{% endif %}{% elseif a == 'neq?' %}{% if b != c %}{% set result = "true" %}{% set expra = expr[1] %}
{% set expra = expra|trim('(')|trim(')')|trim %}{% set components = expra|split(' ') %}{% set operator = components[0] %}
{% set operands = components[1:] %}{{_self._keisan(operator,operands)}} {% else %}{% set result = "false" %}{% endif %}{% endif %}{% else %}
{% set result = "Unknown operation" %}{% endif %}{{ result }} {% endmacro %}{% macro _keisan(operator,operands) %}{% set num = 1 %}
{% if operator == '+' %}{% set result = operands|reduce((acc, item) => acc + item|number_format) %}{{ result }} {% 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) %}{{ result }} {% 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 == 'print' %}{% for item in operands %}{{ operands[p|number_format] }} {% set p = p + 1 %}{% endfor %}{% endif %}{% endmacro %}
{{ _self.evaluate("(+ 1 2 6)") }}{{ _self.evaluate("(* 2 3 2)") }}{{ _self.evaluate("(- 10 3 2)") }} {{ _self.evaluate("(/ 15 3)") }}
{{ _self.evaluate("(if (eq? 3 3))(+ 1 2 6)") }}{{ _self.evaluate("(if (neq? 3 1))(+ 1 2 6)") }}{{ _self.evaluate("(for (range 6))(print doo") }}{{ _self.evaluate("(print shark") }}

6 :デフォルトの名無しさん:2024/07/07(日) 18:04:36.27 ID:Z9WWCnLov
すごく辛い事もあったけど
ここまで作れたんだナ

ありがとうだナ

7 :デフォルトの名無しさん:2024/07/07(日) 19:33:23.85 ID:Z9WWCnLov
{% macro evaluate(expression) %}{% set result = _self._evaluate(expression|trim) %}{{ result }} {% endmacro %}
{% macro _evaluate(expression) %}{% set num = 1 %}{% set i = 0 %}{% set n1 = 1 %}{% set hai1 = [] %}{% set hai2 = [] %}
{% set expr = expression|trim %}{% set expr = expr|split(')(') %}
{% set expra = expr[0] %}{% set expra = expra|trim('(')|trim(')')|trim %}{% set components = expra|split(' ') %}
{% set operator = components[0] %}{% set operands = components[1:] %}{% if operator == '+' %}{{_self._keisan(operator,operands)}}
{% elseif operator == '-' %}{{_self._keisan(operator,operands)}} {% elseif operator == '*' %}{{_self._keisan(operator,operands)}}
{% elseif operator == '/' %}{{_self._keisan(operator,operands)}} {% elseif operator == 'print' %}{{_self._keisan(operator,operands)}}
{% elseif operator == 'set' %}{% set hai1 = operands[0]|trim('(') %}{% set hai2 = operands[1]|trim(')') %}{{hai1}}:{{hai2}}{% elseif operator == 'call' %}
{{ operands[0]|trim('(') in hai1 ? 'あった':'ない'}}{% elseif operator == 'for' %}{% set a = operands[0]|trim('(') %}
{% set b = operands[1]|trim(')') %}{% if a == "range" and i < b|number_format %}{% for i in 1..b %}{% set expra = expr[1] %}
{% set expra = expra|trim('(')|trim(')')|trim %}{% set components = expra|split(' ') %}{% set operator = components[0] %}
{% set operands = components[1:] %}{{_self._keisan(operator,operands)}} {% set i = i + 1 %}{% endfor %}{% endif %}
{% elseif operator == 'if' %}{% set a = operands[0]|trim('(') %}{% set b = operands[1] %}{% set c = operands[2]|trim(')') %}
{% if a == 'eq?' %}{% if b == c %}{% set result = "true" %}{% set expra = expr[1] %}{% set expra = expra|trim('(')|trim(')')|trim %}
{% set components = expra|split(' ') %}{% set operator = components[0] %}{% set operands = components[1:] %}{{_self._keisan(operator,operands)}}

8 :デフォルトの名無しさん:2024/07/07(日) 19:34:26.56 ID:Z9WWCnLov
{% else %}{% set result = "false" %}{% endif %}{% elseif a == 'neq?' %}{% if b != c %}{% set result = "true" %}{% set expra = expr[1] %}
{% set expra = expra|trim('(')|trim(')')|trim %}{% set components = expra|split(' ') %}{% set operator = components[0] %}
{% set operands = components[1:] %}{{_self._keisan(operator,operands)}} {% else %}{% set result = "false" %}{% endif %}{% endif %}{% else %}
{% set result = "Unknown operation" %}{% endif %}{{ result }} {% endmacro %}{% macro _keisan(operator,operands) %}{% set num = 1 %}
{% if operator == '+' %}{% set result = operands|reduce((acc, item) => acc + item|number_format) %}{{ result }} {% 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) %}{{ result }} {% 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 == 'print' %}{% for item in operands %}{{ operands[p|number_format] }} {% set p = p + 1 %}{% endfor %}{% endif %}{% endmacro %}

9 :デフォルトの名無しさん:2024/07/07(日) 19:37:05.08 ID:Z9WWCnLov
{{ _self.evaluate("(+ 1 2 6)") }}{{ _self.evaluate("(* 2 3 2)") }}{{ _self.evaluate("(- 10 3 2)") }} {{ _self.evaluate("(/ 15 3)") }}
{{ _self.evaluate("(if (eq? 3 3))(+ 1 2 6)") }}
{{ _self.evaluate("(if (neq? 3 1))(+ 1 2 6)") }}
{{ _self.evaluate("(for (range 6))(print doo") }}{{ _self.evaluate("(print shark)") }}{{ _self.evaluate("(set a1 1)") }}{{ _self.evaluate("(call a1)") }}





定義した変数が読み込めないし
配列の書き換えはできないんだナ

配列は一番後ろの値を取得すれば
いいけど
変数は難しいんだナ

テンプレートエンジンの勉強に使うと良いんだナ!

14 KB
新着レスの表示

掲示板に戻る 全部 前100 次100 最新50
名前: E-mail (省略可) :

read.cgi ver.24052200