Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> killer features любимого ЯП 
:(
    Опции темы
502
Дата 1.9.2011, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Я всегда прав
*


Профиль
Группа: Участник
Сообщений: 134
Регистрация: 16.7.2011

Репутация: нет
Всего: 4



closure(замыкание)
Код

function sum(a) {
    return function(b) {
        return a+b
    }
}

sum(1)(3) //=> 4

json
Код

var foo = {
    "bar": 42
}

First-class function
Код

function Foo(bar) {
    this.bar = bar;
}

var foo = new Foo(42)
foo.bar //=> 42

PM MAIL   Вверх
newbee
Дата 1.9.2011, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 1
Всего: 19



Closure
Код

(defun foo (a)
 (lambda (b) (+ a b)))


Syntax sucks, AST-programming rocks! Macro.

Код

(defmacro cond (&rest body)
 (labels ((cond-req-fnc (body)
           (if (car body)
            `(if ,(caar body) ,(cadar body) ,(cond-req-fnc (cdr body))))))
  (cond-req-fnc body)))


CLOS, MOP, dynamic and lexical variables, return multiple values, conditions and restarts,..


--------------------
You're face to face
With man who sold the world
PM   Вверх
A5uKa
  Дата 1.9.2011, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


TЋ♥s F1rȜ iƧ BurȠiƞg
***


Профиль
Группа: Awaiting Authorisation
Сообщений: 1928
Регистрация: 30.8.2008

Репутация: 1
Всего: 16



Код

let (^-^) f a = f a

type Parser<'a> = Parser of (string ->('a * string) list)

let extract(Parser(f)) = f

type ParserMonad() =
    member b.Bind(p,f) = Parser ^-^ fun cs ->
                                            let r = extract(p) cs
                                            let r' = List.map (fun (a,cs') -> extract(f a) cs') r
                                            List.concat r'
    member b.Return x = Parser ^-^ fun cs -> [x,cs]
    member b.ReturnFrom v = v
    member b.Zero() = Parser ^-^ fun cs -> []


let (++) p q = Parser ^-^ fun cs -> List.append (extract p cs) (extract q cs)
let (+++) p q = Parser ^-^ fun cs -> match (extract(p ++ q) cs) with
                                      | [] -> []
                                      | x::xs -> [x]

let parser = ParserMonad()

let item = Parser ^-^ fun cs -> match cs with
                                | "" -> []
                                | cs -> [cs.[0], cs.Substring(1)]
                            
let sat p = parser { let! c = item
                     if p c then
                       return c }
                      
let char c = sat ^-^ fun s -> c = s
                                            
let rec stringp s = match s with
                    | "" -> parser { return [] }
                    | xs -> parser { let! c = char xs.[0]
                                     let! cs = stringp (xs.Substring(1))
                                     return c::cs }
                                                          
let rec many1 p = parser { let! x = p
                           let! xs = many p
                           return (x::xs) }
and many p = (many1 p) +++ parser { return [] }

and chain p op =
    let rec rest a = parser { let! f = op
                              let! b = p
                              return! rest(f a b) } +++ parser { return a }
    parser { let! a = p
             return! rest a }
           
let space = many ( sat (fun s -> System.Char.IsWhiteSpace s) )

let token p = parser { let! a = p
                       let! _ = space
                       return a }

let symb cs = token (stringp cs)

let apply p = extract (parser { let! _ = space
                                let! r = p
                                return r })

open System
#nowarn "40"
do
    while true do
        Console.ReadLine() |> fun x ->
            let logOp = parser { let! _ = symb "AND"
                                 return (&&) } +++ parser { let! _ = symb "OR"
                                                            return (||) }
            let digit = parser { let! x = token (sat (fun ch -> Char.IsDigit(ch)))
                                 return ( x = '1' ) }
            let rec expr = chain term logOp
            and term = factor +++ parser { let! _ = symb "NOT"
                                           let! ex = expr
                                           return (not ex) }
            and factor = digit +++ parser { let! _ = symb "("
                                            let! ex = expr
                                            let! _ = symb ")"
                                            return ex }
            let parse s = match apply expr s with
                            | [] -> failwith "failed to parse"
                            | (ret, _)::xs -> ret
            Console.WriteLine (parse x)

Computation Expressions ... итд  smile 

ps. Closure : 
Код

let f a = fun b -> a + b


Это сообщение отредактировал(а) A5uKa - 1.9.2011, 13:23
PM   Вверх
gcc
Дата 2.9.2011, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: нет
Всего: 17



Код

package qxp;
use strict;

sub H($){pack'H*',$_[0]}
sub by{map{[splice@_,1,$_[0]]}!($#_%$_[0])..$#_/$_[0]}
sub is($){$_ eq$_[0]}
sub cat{join'',@_}
sub list{@_}
sub wa{wantarray?@_:cat@_}
sub yuki(&@){shift->();@_}
sub fopen(;$){open my$z,$_[0]||$_;$z}{my %file;
sub file($){readline($file{$_[0]}||=fopen$_[0])}}
sub slurp(;$){wa map{yuki{close$_}<$_>}fopen$_[0]}
#sub spew($;$){sub{map{print $_ $_[1];close$_}fopen$_[0]}->($_[0],$#_?$_[1]:$_)}
sub spew($;$){open my$z,">$_[0]";print $z $#_?$_[1]:$_;close $z}
sub table{map{chomp;[split/\t/]}@_}
sub trim{map{s/^\s+|\s+$//g}@_?@_:$_}
sub count{my%z;$z{$_}++for@_;\%z}
sub uniq{keys%{count@_}}
sub copy{wa local@_=@_}
sub find(&@){no strict 'refs';local(*{(caller).'::a'})=\(my$a=$_[1]);&{$_[0]}||($a=$_)for(@_[2..$#_]);$a}
sub first(&@){$_[0]->()&&return$_ for@_[1..$#_]}
sub min{find{$a<$_}@_}
sub max{find{$a>$_}@_}
sub section{map{$_->[$_[0]]}@_[1..$#_]}
*#=sub{map$#$_,@_};
sub zip{map section($_,@_),0..max &#(@_)}
sub char{substr$#_?shift:$_,$_[0],1}
sub via(&$){local $_=$_[1];$_[0]->()}

*\=sub{map[section($_,@_)],0..max &#(@_)};

{my%ops;*?=sub{ref$_[-1]?map&?($_[0],@$_),&\(@_[1..$#_]):wa do{my@z=$_[1];@z=$ops{$_[0]}->($_,@z)for@_[2..$#_];@z}};
{no strict 'refs';(*$_,$ops{$_})=eval"sub{&?('$_',\@_)},sub{wa(\@_[1..\$#_]) $_ \$_[0]}" for qw'** =~ !~ * / % x + - . << >> < > <= >= lt gt le ge == != <=> eq ne cmp & | ^ && || .. ... = , => and or xor'}}
my%refs=(''=>'_',map{$_=>lc substr $_,0,1}qw{SCALAR ARRAY HASH CODE REF GLOB LVALUE});
sub refs{wa map{$refs{ref $_}||'o'}@_}
sub _{cat map{
  is '' ? $_:
  is 'a' ? @{$_[0]}:
  ()
}refs@_}

sub wday{(int(365.25*($_[2]-($_[1]<3)))+int(30.6*(1+$_[1]+12*($_[1]<3)))+$_[0]-621050)%7+1}
sub leap{$_[0]%4?0:$_[0]%100?1:$_[0]%400?0:1}
sub days{(31,(28+leap $_[1]),(31,30,31,30,31)x2)[$_[0]-1]}
sub cal{by 7,((undef)x(wday(1,@_)-1),1..days @_)}

sub all{@_==grep$_,@_}
sub one{1==grep$_,@_}
sub none{!grep$_,@_}
sub any{!&none}

sub import{no strict 'refs';*{caller(0)."::$_"}=${"$_[0]::"}{$_} for grep !/^(BEGIN|__ANON__|a|import)$/, keys%{"$_[0]::"}}



Код

package L2;

use strict;
use qxp;

sub kludges{cat map{(join': ',@$_)."\n"}by 2,@_}

sub tree2(&$@){
  wa map{
    {
      ARRAY=>sub{$_[0]->(1,$_[1],$_[2],cat tree2($_[0],$_[1]+1,@{$_[3]}))},
      ''=>sub{$_[0]->(0,@_[1..3])}
    }->{ref($_->[1])}->(@_[0,1],@$_)
  }by 2,@_[2..$#_]
}

sub templator(&@){
  my($s,%s,%x)=shift;
  my$x=join'|',map{$x{$_->[0]}=quotemeta$_->[1];$s{$_->[0]}=$_->[2];quotemeta$_->[0]}by 3,@_;
  sub{wa map{s;((??{$x}))(.*?)(??{$x{$1}});$s{$1}($2,$_[1]);eg;$_}$s->($_[0])}
}

sub subst{
  my%s=@_;
  my$s=join'|',map quotemeta,keys%s;
  sub{wa map{s/($s)/$s{$1}/eg;$_}copy @_}
}



# 2do: move to module
sub import{no strict 'refs';*{caller(0)."::$_"}=${"$_[0]::"}{$_} for grep !/^(BEGIN|__ANON__|a|import)$/, keys%{"$_[0]::"}}

666;

PM WWW ICQ Skype GTalk Jabber   Вверх
newbee
Дата 2.9.2011, 07:05 (ссылка) |    (голосов:6) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 1
Всего: 19



gcc, ты продемонстрировал киллер фичу перла - writeonly? smile

Это сообщение отредактировал(а) newbee - 2.9.2011, 07:10


--------------------
You're face to face
With man who sold the world
PM   Вверх
bilbobagginz
Дата 2.9.2011, 07:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 6
Всего: 317



Цитата(newbee @  2.9.2011,  06:05 Найти цитируемый пост)
gcc, ты продемонстрировал киллер фичу перла - writeonly?

+1

Одно из самыс слабых местя этого ЯП - его программисты (это не о gcc: не имею понятия какой он программист)

Как говорится, если тебя будут пытать, постарайся, чтобы этим не занимался любитель 1-liner-ов на перле:
они так страшны, что даже их родные бабушки и мамы их боятся.



Это сообщение отредактировал(а) bilbobagginz - 2.9.2011, 07:43


--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
k0rvin
Дата 3.9.2011, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Цитата(newbee @ 1.9.2011,  11:14)
CLOS, MOP, dynamic and lexical variables, return multiple values, conditions and restarts,..

...символы как объекты первого класса


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
gcc
Дата 14.9.2011, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: нет
Всего: 17



Цитата(newbee @ 2.9.2011,  07:05)
gcc, ты продемонстрировал киллер фичу перла - writeonly? smile

я тут почти все понимаю, вначале особенно, разве что там дальше есть несколько строк где не понятно
тут не вижу никакой writeonly, тем более все идет не всплошную, а функциями (можно сделать методами)
PM WWW ICQ Skype GTalk Jabber   Вверх
502
Дата 14.9.2011, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Я всегда прав
*


Профиль
Группа: Участник
Сообщений: 134
Регистрация: 16.7.2011

Репутация: нет
Всего: 4



Цитата(gcc @  14.9.2011,  13:50 Найти цитируемый пост)
я тут почти все понимаю

ну так, ты ведь это сам написал, не?

а что в perl  использование пробелов(отделение) дурной тон?
PM MAIL   Вверх
Akella
Дата 10.11.2011, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 1
Всего: 329



а вы о чем здесь  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила ведения Религиозных войн
Smartov
1. Уважайте собеседника
2. Собеседник != враг
3. Старайтесь воздерживаться от тем вида "Windows Rulez" или "Linux Rulez"

С уважением, Smartov.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Религиозные войны | Следующая тема »


 




[ Время генерации скрипта: 0.0564 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.