me

XMLbasic и функции

<?xml version="1.0" encoding="utf-8" ?>
<module>
    <define name="hello">
        <code>
            <print>
                <gettext name="arg"/>
                <str> </str>
                <getattr name="what"/>
                <get name="finish"/>
            </print>
        </code>
    </define>
    <main>
        <code>
            <hello what="World">
                <arg>Hello</arg>
                <finish><str>!</str></finish>
            </hello>
        </code>
    </main>
</module>



function name="main" переименовал в main - так нагляднее.
Просится переимемнование code но пока не придумал во что именно.

Поскольку вызов функции - у нас описывается тэгом, это очевидным образом приводит к двум видам передачи параметров:

  • через аттрибуты

  • через вложенные тэги

которые заведомо неравнозначны между собой.
в аттрибуты хорошо ложатся опциональные заведомо константные параметры. К примеру open(2) логично представить в видe:
<open flags="O_RDWR"><filename>...</filename></open>


а вот неименованные параметры плодить не очень удобно. И наверное это правильно.
 сделать <get> по индексу никто не мешает, но пока не делал :)
me

XMLbasic и xslt

<?xml version="1.0" encoding="utf-8" ?>
<module>
    <function name="main">
        <code>
            <print>
                <str>Hello World!</str>
            </print>
        </code>
    </function>
</module>


Легким движением xslt превращается в :
#include <stdio.h>
int main(int argc, char ** argv){
printf("Hello World!");
        return 0;
}
me

Циклы XMLbasic - шаг2.

<?xml version="1.0" encoding="utf-8" ?>
<module>
    <function name="main">
        <code>
            <let name="i" type="int">5</let>
            <repeat>
                <pre-cond>
                    <gt>
                        <var name="i"/>
                        <int>0</int>
                    </gt>
                </pre-cond>
                <block>
                    <print>
                        <str>Iter </str>
                        <var name="i"/>
                    </print>
                </block>
                <post-cond>
                    <dec name="i"/>
                </post-cond>
            </repeat>
        </code>
    </function>
</module>



Бодро печатает:
Iter 5
Iter 4
Iter 3
Iter 2
Iter 1


Код простой как палка:
def tag_repeat(tag):
    preCondition = tag.find('pre-cond')
    postCondition = tag.find('post-cond')
    body = tag.find('block')
    while(preCondition == None or evalChilds(preCondition)):
        evalChilds(body)
        if postCondition != None and not evalChilds(postCondition):
            break

Правда строк уже полторы сотни.

ЗЫЖ: А копипаста из PyCharm прикольно смотрится.
me

XMLbasic - всякое забавное про циклы

Структура XML диктует некоторые особенности построения кода.
Как всем известно(tm) есть два вида циклов - циклы с пред-условием, и циклы с пост-условием.
Поскольку представление оных в XML по факту отличается только расположения условия, имеет смысл свести их в один цикл, выкидывая лишние условия по мере необходимости:
<repeat>
    <pre-condition/>
    <block/>
    <post-condition/>
</repeat>


Конструкция не так безумна как может показаться на первый взгляд. Аналог на С будет выглядеть так:
while(pre_condition){
    ....
    if(!post_condition) break;
}

Соответственно бесконечный цикл while(1){....} просто записывается в виде:
<repeat>
    <block/>
</repeat>

Циклов с двумя условиями мне ранее не попадалось, но айсберг языков программирования - дело такое.
me

Всякие извращения...

<?xml version="1.0" encoding="utf-8" ?>
<module>
   <function name="main">
       <code>
           <let name="ld" type="string">ld</let>
           <let name="w" type="string">Wor<var name="ld"/></let>
           <print>
               <str>Hello</str>
               <var name="w"/>
               <str>!</str>
           </print>
           <let name="a" type="int">3</let>
           <let name="b" type="int">2</let>
           <print><str>a + b = </str>
               <add>
                   <var name="a"/>
                   <var name="b"/>
               </add>
           </print>
       </code>
   </function>
</module>


И ведь работает. При интерпретаторе  менее 100 строк на python.

me

#@$%!!!!!

И всё то у них так
mysql> explain select uid from log l where '2016-12-31' <= l.startday ;
+----+-------------+-------+-------+---------------+----------+---------+------+---------+-----------------------+
| id | select_type | table | type  | possible_keys | key      | key_len | ref  | rows    | Extra                 |
+----+-------------+-------+-------+---------------+----------+---------+------+---------+-----------------------+
|  1 | SIMPLE      | l     | range | startday      | startday | 3       | NULL | 8370032 | Using index condition |
+----+-------------+-------+-------+---------------+----------+---------+------+---------+-----------------------+
1 row in set (0,00 sec)

mysql> explain select uid from log l where '2016-11-31' <= l.startday ;
+----+-------------+-------+------+---------------+------+---------+------+----------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows     | Extra       |
+----+-------------+-------+------+---------------+------+---------+------+----------+-------------+
|  1 | SIMPLE      | l     | ALL  | startday      | NULL | NULL    | NULL | 65140960 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+----------+-------------+
1 row in set (0,21 sec)
me

Маленькая задачка на C

В коментариях родилась задачка, которая на мой взгляд, вполне заслуживает оформления отдельным постом:

Есть код на языке C
#include <stdio.h>
#include <string.h>

void something_wrong() {
  //(1)
  char * p;
  strcpy(p, "Hello");
  printf("%s World\n", p);
}
void some_other_code() {
}

int main()
{
  some_other_code();
  something_wrong();
  return 0;
}




И соответственно вопросы:

  • На 3 балла: Что не так с этим кодом.

  • На 4 балла: Какую строку можно вписать на место (1) чтобы получить корректный код.

  • На 5 баллов: как можно модифицировать  some_other_code() для получения работающей программы, и какие требования к компилятору и среде исполнения при этом необходимы.