Perl.
use Lingua::EN::Numbers qw(num2en_ordinal);
print 'On the ', num2en_ordinal($_+1),' day of Christmas my true love gave to me, ', reverse(( split /\|/, "a partridge in a pear tree.\n|two turtle doves, and |three french hens, |four calling birds, |five gold rings, |six geese a-laying, |seven swans a-swimming, |eight maids a-milking, |nine ladies dancing, |ten lords a leaping, |eleven pipers piping, |twelve drummers drumming, ")[ 0 .. $_ ]) for 0 .. 11;
(459 Символов)
Я хотел сделать это немного более хорошим и выразительным, но это - проблема гольфа.
Этот стиль нарушает надлежащие стандарты кодирования несколько. Но это - гольф для Вас.
Вот менее компактная версия с менее подлыми приемами.
use Lingua::EN::Numbers qw(num2en_ordinal);
my @gifts = (
'a partridge in a pear tree.',
'two turtle doves, and ',
'three french hens, ',
'four calling birds, ',
'five gold rings, ',
'six geese a-laying, ',
'seven swans a-swimming, ',
'eight maids a-milking, ',
'nine ladies dancing, ',
'ten lords a leaping, ',
'eleven pipers piping, ',
'twelve drummers drumming, '
);
for my $verse_id ( 0 .. $#gifts ) {
printf 'On the %s day of Christmas my true love gave to me, ', num2en_ordinal($verse_id +1);
print reverse @verse[ 0 .. $verse_id ];
print "\n";
}
Одна вещь, которую вы должны помнить, - это то, что ждет этот код в будущем. Планируете ли вы разрабатывать (и выпускать) на обеих платформах в будущем? Или это односторонний перенос?
Лучшее, что можно сделать при переносе проекта, - сохранить как можно меньше фактических изменений кода. В вашем случае это будет означать использование решения pthread. При этом, если вы планируете сделать это односторонним портом, переход на родной язык никогда не повредит. :)
Я бы потратил некоторое время на то, чтобы полностью изучить обе стратегии, а затем реализовать ту, которая вам удобнее всего.
Все будет одинаково (pthreads просто вызовет EnterCriticalSection и т. Д.), Поэтому, если у вас есть оболочка pthreads, вам, вероятно, следует использовать ее, чтобы не нужно изменить столько же кода
В приложениях Windows C / C ++, которые используют CRT, необходимо вызвать beginthread / beginthreadex , чтобы правильно инициализировать CRT в новом потоке.
Почему бы не взять лучшее из обоих миров и не использовать библиотеку, которая включает в себя как pthreads, так и Window API, и использует подходящий из них? Ваш код остается одинаковым на обеих платформах.
В C ++ нет недостатка в таких библиотеках, поэтому я не могу представить, что там нет версий C.
Совершенно верно. Либо реализуйте IDynamicMetaObjectProvider
, либо унаследуйте от DynamicObject
для гораздо более простого маршрута. См. Несколько хороших примеров в документации DLR .
Вот быстрый пример DynamicObject
:
using System;
using System.Dynamic;
public class MyDynamic : DynamicObject
{
public override bool TryInvokeMember
(InvokeMemberBinder binder,
object[] args,
out object result)
{
Console.WriteLine("I would have invoked: {0}",
binder.Name);
result = "dummy";
return true;
}
public string NormalMethod()
{
Console.WriteLine("In NormalMethod");
return "normal";
}
}
class Test
{
static void Main()
{
dynamic d = new MyDynamic();
Console.WriteLine(d.HelloWorld());
Console.WriteLine(d.NormalMethod());
}
}
У меня есть более крупный пример DynamicObject
в 2-м издании C # в деталях , но я еще не реализовал IDyamicMetaObjectProvider
. Я сделаю это до выпуска книги, но в настоящее время в выпуске раннего доступа есть только пример DynamicObject
. Кстати, если купишь сегодня за полцены - используйте код twtr0711 . Я отредактирую этот ответ позже, чтобы удалить этот бит :)
this works well: http://sourceware.org/pthreads-win32/
It is a port of the pthreads library for Windows.