1. Lua / Говнокод #25014

    0

    1. 1
    2. 2
    _G = setmetatable(_G, {__newindex = function(t,k,v) t[k] = "sG_nil" end})
    pitux=1

    чо поцоны, изи рекурсия.

    Запостил: 3oJIoTou_xyu, 24 Октября 2018

    Комментарии (35) RSS

    • Переведи на "PHP".
      Ответить
      • а давай ты переведешь.
        Ответить
      • Не благодари
        <?php
        $handle = popen('/usr/bin/env lua', 'w');
        fwrite($handle, <<<LUA
        _G = setmetatable(_G, {__newindex = function(t,k,v) t[k] = "sG_nil" end})
        pitux=1
        LUA
        );
        pclose($handle);
        Ответить
        • >>>"popen"

          А "gagen" есть?
          Ответить
        • показать все, что скрытоvanished
          Ответить
          • Забавно, что в РНР назвать метод eval можно только через сишное апи. Именно поэтому я за РНР.
            Ответить
            • Я eval такой API.

              Можно через «перегрузку»:
              <?php
              
              class nemyx {
                  public static function __callStatic($name, $arguments) {
                      if ($name === 'eval') {
                          return array_reduce($arguments, function($carry, $item) {return $carry * $item;}, 1);
                      } else {
                          die("Метод $name не найден.");
                      }
                  }
              
                  private $data = array();
              
                  function __construct() {
                      $this->data = func_get_args();
                  }
              
                  public function __call($name, $arguments) {
                      if ($name === 'eval') {
                          if(count($arguments) > 0) {
                              die("Аргументы не требуются.");
                          }
                          return array_reduce($this->data, function($carry, $item) {return $carry * $item;}, 1);
                      } else {
                          die("Метод $name не найден.");
                      }
                  }
              
              }
              
              echo nemyx::{'eval'}(1, 2, 3, 4, 5) . PHP_EOL; // если написать nemyx::eval, то будет синт. ошибка
              
              $kokoko = new nemyx(1, 2, 3, 4, 5);
              
              echo $kokoko->eval() . PHP_EOL;


              http://ideone.com/5SJWEh
              Ответить
              • Вообще прикольно, что нужно писать nemyx::{'имя_метода'} вместо nemyx::имя_метода, если имя_метода совпало с чем-то зарезервированным.

                А ещё прикольно, что по сути получилось ООП, как в Smalltalk/Obj-C: у нас единый диспетчер (__call для вызова из экземпляра объекта и __callStatic для вызова без $this) обрабатывает произвольные сообщения (в данном случае имя метода 'eval' — это по сути сообщение).
                Ответить
        • Переведи на "Lua".
          Ответить
    • Это что, типа перегрузки оператора "="? При вызове присваивания вызывается new_index, который, в свою очередь, вызывает присваивание...
      Ответить
      • ноуп. local x=1 или math="pitux" отработает нормально.
        Эта мета вызывается когда новый элемент в таблице пытается появится
        _G эта таблица глобальных переменных.
        То есть любая глобальная переменная = элементу таблицы _G
        следовательно создавая новую глобальную переменую он создает новый элемент в _G и вызывает метаметод __newindex который в свою очередь присваивает _G["pitux"]="sG_nil" снова, и опять вызывется этот метаметод а потом снова и снова.
        Ответить
    • показать все, что скрытоvanished
      Ответить
    • луа гавно
      Ответить

    Добавить комментарий