Re[6]: RustyCage
От: Cyberax Марс  
Дата: 23.01.14 08:40
Оценка:
Здравствуйте, kaa.python, Вы писали:

C>>Надо лучше начать добавлять поддержку в IDEA

KP>О даа! Очень бы хотелось иметь такую поддержку! Vim + Sublime – это, безусловно, прекрасно, но для популяризации языка среди не юниксоидов IDE жизненно необходима.
Я честно думаю начать делать как только язык более-менее подойдёт к версии 1.0. Мы делали поддержку в IDEA для нашего языка, получалось совсем несложно — можно попробовать ещё раз.
Sapienti sat!
Re[7]: RustyCage
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 23.01.14 08:41
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Я честно думаю начать делать как только язык более-менее подойдёт к версии 1.0. Мы делали поддержку в IDEA для нашего языка, получалось совсем несложно — можно попробовать ещё раз.


Версия 1.0 должна быть ближе к концу осени, насколько я понимаю планы "растовцев". Пиши тут, как начнете, постараюсь подключиться.
Re[3]: Развитие Rust
От: cl-user  
Дата: 23.01.14 09:43
Оценка:
Здравствуйте, kaa.python, Вы писали:

похоже, в 0.9 много чего изменили... Смотрю библиотеки с гитхба — не собираются. Надо различия смотреть...
Re[4]: Развитие Rust
От: cl-user  
Дата: 23.01.14 11:27
Оценка:
Можно я ещё с простенькими вопросами по пристаю?

Вот такую конструкцию:
FromPrimitive::from_int(x).unwrap();
легче никак не сделать? Я по наивности подумал, что реализация FromPrimitive позволит писать 'x as int'
Re[5]: Развитие Rust
От: cl-user  
Дата: 23.01.14 11:32
Оценка:
Здравствуйте, cl-user, Вы писали:

CU>'x as int'


чёрт, сообщения не редактируются? имелось в виду 'x as MyType' конечно же
Re[5]: Развитие Rust
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 24.01.14 07:47
Оценка:
Здравствуйте, cl-user, Вы писали:

CU>Вот такую конструкцию:
FromPrimitive::from_int(x).unwrap();
легче никак не сделать? Я по наивности подумал, что реализация FromPrimitive позволит писать 'x as int'


Твое ожидание не совсем оправданно и вот почему. Для примера можно взять такой код:

use std::num::FromPrimitive;
use std::int;

#[deriving(FromPrimitive)]  // (1)
enum MyType {
    Val1 = 0,
    Val2 = 1,
    Val3 = 10
}

fn main() {
    let val1: Option<MyType> = FromPrimitive::from_int(1);     // (2)
    let val2: Option<MyType> = FromPrimitive::from_int(2);     // (3)

    println!("{:?}, {:?}", val1, val2);
}


Данное приведение типов создавалось с оглядкой на стандартные перечисления из языка Си. При этом, значения входящие в перечисление в Си, как впрочем и в Rust, не должны идти последовательно, одно за другим. Поэтому, объявляем перечисление TestData приводимым при помощи FromPrimitive (1) и делаем две конверсии, одну для существующего в перечислении значения 1 (2), а вторую для не существующего значения 2 (3). В консоли у нас окажется, как и ожидалось:
Some(Val2), None


А теперь к твоему примеру с "x as MyType". В твоем примере предполагается, что все конверсии должны проходить успешно. Но что делать, если конверсия не удалась и нам вернулся None из примера выше (3)? Попытка "добыть" значение из None приведет к следующим последствиям:
val2.unwrap();

task '<main>' failed at 'called `Option::unwrap()` on a `None` value'


В то время как гарантировать преобразование от числового значения к нашему типу мы не можем.
Re[6]: Развитие Rust
От: cl-user  
Дата: 24.01.14 10:42
Оценка:
kaa.python, спасибо!

Тогда ещё вопрос: почему в примерах используется именно такая запись:
let val1: Option<MyType> = FromPrimitive::from_int(1);
вместо
let val1 = MyType.from_int(1);
Ведь так несколько короче. Или они не равноценны?
Re[7]: Развитие Rust
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 24.01.14 10:48
Оценка:
Здравствуйте, cl-user, Вы писали:

CU>Тогда ещё вопрос: почему в примерах используется именно такая запись:
let val1: Option<MyType> = FromPrimitive::from_int(1);
вместо
let val1 = MyType.from_int(1);
Ведь так несколько короче. Или они не равноценны?


Запись вида "MyType.from_int(1)" предполагает что делается вызов функции from_int применительно к объекту (именно объекту, а не типу) MyType, а у тебя такого объекта нет.
Re[7]: Развитие Rust
От: cl-user  
Дата: 24.01.14 11:02
Оценка:
Здравствуйте, cl-user, Вы писали:

CU>
let val1 = MyType.from_int(1);


Вот засада, а так написать и не получается... Т.е. from_int "привязана" к FromPrimitives, а не к MyType? Как же тогда написать FromPrimitive::from_int(1) внутри выражения, чтобы оно вернуло именно MyType? Т.е. как его "типизировать"?
Re[8]: Развитие Rust
От: cl-user  
Дата: 24.01.14 11:29
Оценка:
И ещё. Почему, если описание трэйта Add такое:
pub trait Add<RHS, Result> {
    fn add(&self, rhs: &RHS) -> Result;
}

я не могу написать 2 "имплементации":
impl Add<MyType, MyType> for MyType {
    fn add(&self, other: &MyType) -> MyType {
        ...
    }
}

impl Add<u64, MyType> for MyType {
    fn add(&self, other: u64) -> MyType {
        ...
        }
    }
}

Или это надо делать как-то по другому?
Re[9]: Развитие Rust
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 24.01.14 14:03
Оценка: :)
Здравствуйте, cl-user, Вы писали:

CU>я не могу написать 2 "имплементации":


Потому что перегрузка функций не поддерживается по принципиальным соображениям.

CU>Или это надо делать как-то по другому?


Ага, в Rust-стиле: add_int, add_uint и т.д.
Re[10]: Развитие Rust
От: cl-user  
Дата: 26.01.14 23:13
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>Ага, в Rust-стиле: add_int, add_uint и т.д.


Ок. Появились ещё вопросы:

1. Взаимозаменяемость функций и замыканий есть или нет? получаю сообщения
mismatched types: expected `fn(int) -> f32` but found `|int| -> f32` (expected extern fn but found fn)
mismatched types: expected `|int| -> f32` but found `fn(int) -> f32` (expected fn but found extern fn)

Как-нибудь можно привести одно к другому?

2. Не могу вставить в структуру замыкание: получаю "missing lifetime specifier" — что с этим делать?
Re[11]: Развитие Rust
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 27.01.14 05:48
Оценка:
Здравствуйте, cl-user, Вы писали:


CU>1. Взаимозаменяемость функций и замыканий есть или нет? получаю сообщения

CU>
mismatched types: expected `fn(int) -> f32` but found `|int| -> f32` (expected extern fn but found fn)
CU>mismatched types: expected `|int| -> f32` but found `fn(int) -> f32` (expected fn but found extern fn)

CU>Как-нибудь можно привести одно к другому?

Полагаю что нет, т.к. Rust довольно придирчев к типам данных, при этом замыкание и функция имеют разные типы. Больше того, на уровне ядра языка для распределния памяти для замыкания используется специальная функция. Так что я думаю что без вариантов.

CU>2. Не могу вставить в структуру замыкание: получаю "missing lifetime specifier" — что с этим делать?


Добавить спецификацию времени жизни для замыкания, скороей всего
Re[11]: Развитие Rust
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 27.01.14 11:29
Оценка:
А вообще, лучше бы ты код того что пытаешься сделать привел.
Re[12]: Развитие Rust
От: cl-user  
Дата: 27.01.14 11:51
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>А вообще, лучше бы ты код того что пытаешься сделать привел.


рано ещё

Задолбался с разными типами указателей на строку

Вот так нельзя: 'struct S1 { name: &str }' — "missing lifetime specifier", а на кой он мне?

Вот так можно: 'struct S1 { name: ~str }' — Ok

Теперь надо в функции создать структуру и передать имя в сишную функцию:

fn f1(_name: &str) {
  let s = S1 { name: _name }; // так нельзя, надо ~str а не &str
  ...
  name.with_c_str(|s| ...     // так можно, но если тип параметра функции изменить на ~str, то опять получим ошибку


Вот перепробовал уже 48 вариантов, но ни как не могу получить из &str -> ~str или ~str -> &str
Из-за большой ломки в версии 0,9 большая часть мануалов в сети "не совсем точна". Плюс к этому сам str какой-то очень особый тип
Re[13]: Развитие Rust
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 27.01.14 12:20
Оценка:
Здравствуйте, cl-user, Вы писали:

Вообще, я тебя обманул, функции и замыкания вполне себе взаимозаменяемые, и в действительности просто ключевое слово в очередной раз переименовали
fn test(func: proc()) {
    func();
}

fn test_func() {
    println!("Inside function");
}

fn main() {
    do test {
        println!("Inside clojure");
    }

    test(test_func);
}


CU>Вот перепробовал уже 48 вариантов, но ни как не могу получить из &str -> ~str или ~str -> &str


Таки я бы начал с чтения документации Смотри: &str – ссылка на "какую-то строку". Эта строка может быть размещена на стеке, в локальной куче или куче обмена, т.е. компилятор не имеет ни малейшего представления о том, что ты передал и ожидает некой подсказки. Так как все эти 3 хранилища разделены физически, тебе необходимо сделать явное преобразование, как в примере ниже:

struct S1 { name: ~str }

fn foo(name: &str) {
    let val = name.into_owned();
    let s = S1 { name: val };
}
Re[13]: Развитие Rust
От: cl-user  
Дата: 27.01.14 12:28
Оценка:
Вот так всегда, опять поторопился...
С ~str всё работает, просто значение надо клонировать перед повторным использованием, о чём компилятор недвусмысленно и сообщает
Re[14]: Развитие Rust
От: cl-user  
Дата: 27.01.14 16:39
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>Вообще, я тебя обманул, функции и замыкания вполне себе взаимозаменяемые, и в действительности просто ключевое слово в очередной раз переименовали


Спасибо! Сейчас попробую. Я видел в доках proc, но меня смутило, что такое замыкание может вызываться "единожды". Или имелось в виду — только в одном месте?

KP>struct S1 { name: ~str }

KP>fn foo(name: &str) {
KP>    let val = name.into_owned();
KP>    let s = S1 { name: val };
KP>}
KP>


ааааа, into_owned()!!!... пойду ещё раз гляну документацию

И сразу ещё вопрос:
внутри функции создаю структуру и передаю указатель на неё в сишную либу (а-ля регистрация клбэков):
pub struct MyCallback<'a> { ... }
pub fn f1(...) {
    let rcs = ~MyStruct { ... };
    unsafe { __ext_func(to_unsafe_ptr(rcs), ...); }
}
После завершения этой функции rcs дропнется? Судя по аварийному завершению при попытке в другой функции восстановить структуру из пришедшего указателя, это так.
Как "заморозить" структуру?

Пытаюсь создать static вектор верхнего уровня модуля для "хранения" подобных структур — не получается Как?!
Re[15]: Развитие Rust
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 28.01.14 07:23
Оценка:
Здравствуйте, cl-user, Вы писали:

CU>}[/code] После завершения этой функции rcs дропнется? Судя по аварийному завершению при попытке в другой функции восстановить структуру из пришедшего указателя, это так.

CU>Как "заморозить" структуру?

Ожидаемо. Ты вышел и скоупа f1, количество ссылок на rcs стало равным нулю. Попробуй хранить ее где-то выше.
Re[15]: Развитие Rust
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 28.01.14 07:38
Оценка:
Здравствуйте, cl-user, Вы писали:

CU>Пытаюсь создать static вектор верхнего уровня модуля для "хранения" подобных структур — не получается Как?!


Еще можно попробовать глянуть вот этот документ, я пока что его только по диагонали проглядел.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.